PyQt的 - QMenu动态填充和点击
-
13-09-2019 - |
题
我需要能够知道我点击了动态生成的菜单系统是什么项目。我只是想知道我点击了什么,即使它只是一个字符串表示。
def populateShotInfoMenus(self):
self.menuFilms = QMenu()
films = self.getList()
for film in films:
menuItem_Film = self.menuFilms.addAction(film)
self.connect(menuItem_Film, SIGNAL('triggered()'), self.onFilmSet)
self.menuFilms.addAction(menuItem_Film)
def onFilmRightClick(self, value):
self.menuFilms.exec_(self.group1_inputFilm.mapToGlobal(value))
def onFilmSet(self, value):
print 'Menu Clicked ', value
解决方案
而不是直接使用onFilmSet
作为连接的接收机的,使用lambda功能,以便可以传递附加参数:
receiver = lambda film=film: self.onFilmSet(self, film)
self.connect(menuItem_Film, SIGNAL('triggered()'), receiver)
其他提示
看看在Qt的属性系统。您可以动态地添加包含字符串或任何你想要的,它定义了动作的属性。然后就可以使用发送者()方法在槽中得到的QObject调用槽。然后,查询您设置属性,做你想要相应不管。
但是,这是不这样做的最佳方法。使用发送方()是不建议,因为它违反模块化面向对象的原则。
,最好的方法是使用QSignalMapper类。此类映射来自不同对象的信号,以使用不同的参数相同的时隙。
我没有使用过的PyQt所以我无法给你确切的语法或一个例子,但它不应该是很难找到一个小小的研究。
我试图找出一个类似的问题,看着这上面的代码后,对我来说是什么工作。认为这将是很好的表现出来一起。 =)
self.taskMenu = QtGui.QMenu("Task")
self.tasks = self.getTasks() #FETCHES A LIST OF LIST
self.menuTasks = QtGui.QMenu()
for item in self.tasks:
menuItem_Task = self.taskMenu.addAction(item[1])
receiver = lambda taskType=item[0]: self.setTask(taskType)
self.connect(menuItem_Task, QtCore.SIGNAL('triggered()'), receiver)
self.taskMenu.addAction(menuItem_Task)
def setTask(self,taskType):
print taskType
只是一些其他信息, 我不知道为什么,但lambda函数不会用新PyQt的语法连接工作:
的代码示例不工作:
self.contextTreeMenuAssignTo = QtGui.QMenu(self)
actionAssign = contextMenu.addMenu( self.contextTreeMenuAssignTo )
actionAssign.setText("Assign to : ")
for user in self.whoCanBeAssignated() :
actionAssignTo = QtGui.QAction( user[0] ,self)
self.contextTreeMenuAssignTo.addAction( actionAssignTo )
actionAssignTo.triggered.connect( lambda userID = user[1] : self.assignAllTo( userID ) )
但是,如果你用替补多旧式连接语法中的最后一行:
self.connect(actionAssignTo, QtCore.SIGNAL('triggered()'), lambda userID = user[1] : self.assignAllTo( userID ) )
一切都很好。 随着新的连接语法,你只能得到循环的最后一个元素:(
我发现此回答这里处理这一问题PyQt5,python3。我不喜欢它的BVAL变量是精确的,因为我不完全理解它,但它花了很长时间找到,所以我想我会在这里分享。所述BVAL从触发拾取布尔值,并且允许任务类型传递。
self.taskMenu = QtGui.QMenu("Task")
self.tasks = self.getTasks() #FETCHES A LIST OF LIST
self.menuTasks = QtGui.QMenu()
for item in self.tasks:
menuItem_Task = self.taskMenu.addAction(item[1])
receiver = lambda: bVal, taskType=item: self.setTask(bVal, taskType)
menuItem_Task.triggered.connect(receiver)
self.taskMenu.addAction(menuItem_Task)
def setTask(self, ignore_bVal, taskType):
print taskType
不隶属于 StackOverflow