在 QTreeView 中右键单击 QHeaderView

3
我编写了一个具有多列的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个回答

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

0
我会选择方案2:编写一个继承QHeaderView的自定义类。 你的分段错误可能来自于Python/PyQt的故障? 你应该确保DiceHeaders对象存在,通过保持对它的引用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接