如何在 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_())
您好,我正在使用 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_())