右键单击QTreeView内的QHeaderView

时间:2010-04-20 07:27:39

标签: python qt pyqt 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:使用我自己的MousePressEvent函数编写QHeaderView的后代,并将其用于我的标题。到目前为止,我没有成功将新的头类连接到QTreeView后代。我一直在运行时遇到分段错误,没有更多解释。

#in DiceView's init, where DiceHeaders is the QHeaderView descendant
self.setHeader(DiceHeaders())

有什么想法吗?

2 个答案:

答案 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对象存在。