我有一个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()
但这些似乎仅涉及实际的表选择,而不是标题。
一旦我设法获得右键单击的标题索引,我就可以轻松地将菜单限制为仅在选择了正确的索引时显示(那些只有复选框的列),所以这是另外一件事,真的。
我错过了什么?提前感谢您的帮助。
答案 0 :(得分:4)
customContextMenuRequested
信号将上下文菜单事件的位置发送为QPoint
。方便的是,表的标题有一个logicalIndexAt的重载,可以直接利用它,所以你可以简单地做:
def show_header_context_menu(self, position):
column = self.headers.logicalIndexAt(position)
答案 1 :(得分:0)
我看到你正在使用python,但我认为这仍然有用。
尝试创建一个QHeaderView
派生类,并尝试覆盖
void QHeaderView::mousePressEvent ( QMouseEvent * e )
获取右键单击鼠标事件,然后使用
int QHeaderView::logicalIndexAt ( int x, int y ) const
获取右键单击列的逻辑索引。最后显示上下文菜单。