Reputation: 493
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
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