【问题标题】:How to send signal in context menu of QTreeWidget?如何在 QTreeWidget 的上下文菜单中发送信号?
【发布时间】:2016-03-14 13:20:10
【问题描述】:


您好,我正在 Windows 7 中使用 python3.4、PyQt5 制作桌面 GUI 应用程序。我制作了一个简单的 QTreeWidget。我添加了一个上下文菜单。

我的参考代码是这个 (https://wiki.python.org/moin/PyQt/Creating%20a%20context%20menu%20for%20a%20tree%20view)

参考代码运行良好。当我在 QTreeWidgetItem 上单击鼠标右键时,会弹出上下文菜单。

但我不知道如何在用户点击上下文菜单时发出信号。

我该怎么办?

【问题讨论】:

  • 你的意思是当你左键点击上下文菜单的一个动作时发出一个信号?
  • 是的! 'tmoreau'。这就是我想要的!
  • 看看QMenu doc,已经有信号了。
  • 我知道有一个很好的 qt 文档。但我想知道python版本的文档或教程。有什么好的教程或示例吗?

标签: python-3.x pyqt pyside


【解决方案1】:

使用相同的示例并添加了带有事件的 QAction。正如 tmoreau 所说,您需要很好地阅读文档:)

import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from functools import partial

data = [
    ("Alice", [
        ("Keys", []),
        ("Purse", [
            ("Cellphone", [])
            ])
        ]),
    ("Bob", [
        ("Wallet", [
            ("Credit card", []),
            ("Money", [])
            ])
        ])
    ]

class Window(QWidget):

    def __init__(self):

        QWidget.__init__(self)

        self.treeView = QTreeView()
        self.treeView.setContextMenuPolicy(Qt.CustomContextMenu)
        self.treeView.customContextMenuRequested.connect(self.openMenu)

        self.model = QStandardItemModel()
        self.addItems(self.model, data)
        self.treeView.setModel(self.model)

        self.model.setHorizontalHeaderLabels([self.tr("Object")])

        layout = QVBoxLayout()
        layout.addWidget(self.treeView)
        self.setLayout(layout)

    def addItems(self, parent, elements):

        for text, children in elements:
            item = QStandardItem(text)
            parent.appendRow(item)
            if children:
                self.addItems(item, children)

    def openMenu(self, position):

        indexes = self.treeView.selectedIndexes()
        if len(indexes) > 0:

            level = 0
            index = indexes[0]
            while index.parent().isValid():
                index = index.parent()
                level += 1

        menu = QMenu()
        editMenu = None
        if level == 0:
            editMenu = QAction("Edit person", self)
            menu.addAction(editMenu)
        elif level == 1:
            editMenu = QAction("Edit object/container", self)
            menu.addAction(editMenu)
        elif level == 2:
            editMenu = QAction("Edit object", self)
            menu.addAction(editMenu)

        if editMenu:
            editMenu.triggered.connect(partial(self.editObjFunc, level))

        menu.exec_(self.treeView.viewport().mapToGlobal(position))

    def editObjFunc(self, level):
        print level


if __name__ == "__main__":

    app = QApplication(sys.argv)
    window = Window()
    window.show()
    sys.exit(app.exec_())

【讨论】:

  • 谢谢你,'Achayan'!你节省了我的时间!我会尽量理解qt文档。
猜你喜欢
  • 2010-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-27
  • 2022-01-03
  • 1970-01-01
相关资源
最近更新 更多