passion053
passion053

Reputation: 493

How to send signal in context menu of QTreeWidget?


Hello I am making a desktop GUI application using python3.4, PyQt5 in windows 7. I've made a simple QTreeWidget. And I added a context menu.

My reference code is this (https://wiki.python.org/moin/PyQt/Creating%20a%20context%20menu%20for%20a%20tree%20view)

Reference code works well. When I clicked the right mouse on the QTreeWidgetItem, context menu pops up.

But I don't know how to emit a signal when a user clicks context menu.

What should I do?

Upvotes: 0

Views: 1302

Answers (1)

Achayan
Achayan

Reputation: 5885

Used the same example and added QAction with events. As tmoreau said you need to read the doc very well :)

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_())

Upvotes: 1

Related Questions