在QTreeView中右击QHeaderView
我写了一个QTreeView的子类,支持多列显示。我想在用户右键点击列标题时弹出一个菜单。我尝试从QTreeView捕获信号,但发现QTreeView在标题上似乎并没有发出信号,而QTreeView.header()是可以的。因此,我觉得我必须要么:
1: 将QHeaderView的某个信号连接到弹出菜单的函数上 - 但我找不到一个在单击右键时会触发的信号。我试过sectionClicked、sectionHandleDoubleClicked、sectionDoubleClicked和sectionPressed(双击的函数没能捕捉到单击右键是可以理解的,但它们确实能捕捉到双击右键)
self.header().sectionClicked.connect(self.headerMenu)
self.header().sectionHandleDoubleClicked.connect(self.headerMenu)
self.header().sectionDoubleClicked.connect(self.headerMenu)
self.header().sectionPressed.connect(self.headerMenu)
或者,
2: 写一个QHeaderView的子类,自己实现MousePressEvent函数,然后用这个新的类来做我的标题。到目前为止,我还没能把新的标题类连接到QTreeView的子类上。运行时总是出现段错误,但没有更多的解释。
#in DiceView's init, where DiceHeaders is the QHeaderView descendant
self.setHeader(DiceHeaders())
有没有什么好主意?
2 个回答
0
我建议你选择第二种解决方案:自己写一个类,继承QHeaderView。你遇到的段错误可能是因为Python或PyQt的问题?你应该确保你的DiceHeaders对象是存在的,可以通过保持对它的引用来做到这一点。
6
我发现了一个叫做setContextMenuPolicy的函数:
self.header().setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
self.header().customContextMenuRequested.connect(self.headerMenu)
然后,在headerMenu里:
def headerMenu(self, pos):
globalPos = self.mapToGlobal(pos)
menu = QMenu()
menu.addAction("test item")
selectedItem = menu.exec_(globalPos)
if selectedItem:
print "selected: ", selectedItem