右键单击QTableWidget获取标题列

Wil*_*ers 5 python qt pyqt pyqt4 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)
Run Code Online (Sandbox Code Playgroud)

这导致以下上下文菜单调用:

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
Run Code Online (Sandbox Code Playgroud)

这会弹出一个上下文菜单,但我找不到任何方法来获取右键单击的标题的索引,我已经尝试self.headers.selectedIndexes()过,self.headers.currentIndex()但这些似乎只与实际的表选择有关,而不是标题.

一旦我设法获得右键单击的标题索引,我就可以轻松地将菜单限制为仅在选择了正确的索引时显示(那些只有复选框的列),所以这是另外一件事.

我错过了什么?在此先感谢您的帮助.

ekh*_*oro 5

customContextMenuRequested信号将上下文菜单事件的位置作为QPoint. 方便的是,表的标题有一个可以直接利用的logicalIndexAt重载,因此您可以简单地执行以下操作:

def show_header_context_menu(self, position):
    column = self.headers.logicalIndexAt(position)
Run Code Online (Sandbox Code Playgroud)