我需要能够知道我点击了动态生成的菜单系统是什么项目。我只是想知道我点击了什么,即使它只是一个字符串表示。

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
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top