右键单击 QTreeView 内的 QHeaderView
Posted
技术标签:
【中文标题】右键单击 QTreeView 内的 QHeaderView【英文标题】:Right clicking on QHeaderView inside of QTreeView 【发布时间】:2010-04-20 07:27:39 【问题描述】:我已经编写了具有多列的 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())
有什么想法吗?
【问题讨论】:
【参考方案1】:我发现了 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
【讨论】:
【参考方案2】:我会选择解决方案 n°2:编写您自己的继承 QHeaderView 的类。 您的分段错误可能来自 python/pyqt 故障? 您应该通过保留对 DiceHeaders 对象的引用来确保它存在。
【讨论】:
以上是关于右键单击 QTreeView 内的 QHeaderView的主要内容,如果未能解决你的问题,请参考以下文章