我写了一个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:使用我自己的MousePressEvent函数编写QHeaderView的后代,并将其用于我的标题。到目前为止,我没有成功将新的头类连接到QTreeView后代。我一直在运行时遇到分段错误,没有更多解释。
#in DiceView's init, where DiceHeaders is the QHeaderView descendant
self.setHeader(DiceHeaders())
有什么想法吗?
答案 0 :(得分:4)
我发现了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
答案 1 :(得分:0)
我会寻求解决方案n°2:编写自己继承QHeaderView的类。 您的分段错误可能来自python / pyqt故障? 你应该通过保持对它的引用来确保你的DiceHeaders对象存在。