在QTreeView中右击QHeaderView

3 投票
2 回答
4809 浏览
提问于 2025-04-15 21:48

我写了一个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

撰写回答