2012-08-09 468 views
4

我有一个QTableWidget,其列数仅为复选框(有些不是)。我正在尝试实现一项功能,以便当用户右键单击与“仅限复选框”列相关的标题项时,将显示“取消全部选中”或“全部选中”选项。QTableWidget右键单击获取标题列

到目前为止,我已经成功地实现通过以下信号customContextMenu

self.headers = self.tblData.horizontalHeader() 
self.headers.setContextMenuPolicy(Qt.CustomContextMenu) 
self.headers.customContextMenuRequested.connect(self.show_header_context_menu) 
self.headers.setSelectionMode(QAbstractItemView.SingleSelection) 

从而导致以下上下文菜单调用:

def show_header_context_menu(self, position): 
    menu = QMenu() 
    deselect = menu.addAction("Clear Checked") 
    ac = menu.exec_(self.tblData.mapToGlobal(position)) 
    if ac == deselect: 
     pass 
     #Actually do stuff here, of course 

此弹出一个快捷菜单,但是我找不到任何方法来获取右键单击标题的索引,我试过self.headers.selectedIndexes()以及self.headers.currentIndex(),但这些似乎只涉及到实际的表格选择,而不是标题。

一旦我设法得到右键单击的标题索引,我可以很容易地限制菜单显示,只有当选择了正确的索引(那些只有复选框的列),所以这是一个额外的事情,真的。

我错过了什么?预先感谢您的帮助。

回答

2

customContextMenuRequested信号发送上下文菜单事件作为QPoint的位置。方便地,表头有logicalIndexAt可以直接利用的过载,所以你可以简单地做:

def show_header_context_menu(self, position): 
    column = self.headers.logicalIndexAt(position) 
+0

完美。我知道我错过了一些东西!万分感谢! – WilcoRogers 2012-08-10 01:05:08

0

我看到你正在使用python,但我认为这应该仍然有效。

尝试创建一个QHeaderView派生类和尝试覆盖的

void QHeaderView::mousePressEvent (QMouseEvent * e) 

行为得到右击鼠标事件,然后使用

int QHeaderView::logicalIndexAt (int x, int y) const 

获得列的逻辑索引这是右键单击。最后显示你的上下文菜单。

参见http://doc.qt.nokia.com/4.7-snapshot/qheaderview.html