2

我已经编写了具有多列的 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())

有任何想法吗?

4

2 回答 2

5

我发现了 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
于 2010-04-20T23:40:56.967 回答
0

我会选择解决方案 n°2:编写你自己的继承 QHeaderView 的类。您的分段错误可能来自 python/pyqt 故障?您应该通过保留对 DiceHeaders 对象的引用来确保它存在。

于 2010-04-21T06:19:20.743 回答