如何在 QTreeWidget 的上下文菜单中发送信号?

How to send signal in context menu of QTreeWidget?


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

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

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

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

我该怎么办?

使用相同的示例并添加带有事件的 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_())