右键单击 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的主要内容,如果未能解决你的问题,请参考以下文章

Qt QTreeView clicked函数如何区分左右键

在 PyQt 中支持拖放的 QTreeView

Qt - QPushButtons 代替 QTreeView 项目

如何在 QTableView 列中添加 QTreeView

网站不允许右键单击,网络抓取不显示正文标签之间的文本

如何在项目编辑期间清除 QTreeView 中的背景?