6

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

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
4

5 回答 5

11

不要直接用作连接的接收者,而是onFilmSet使用 lambda 函数,以便您可以传递其他参数:

receiver = lambda film=film: self.onFilmSet(self, film)
self.connect(menuItem_Film, SIGNAL('triggered()'), receiver)
于 2009-09-23T08:01:51.117 回答
2

我在这里找到了这个答案来处理 PyQt5,python3 中的这个问题。我不喜欢它,准确地说是 bVal 变量,因为我不完全理解它,但花了很长时间才找到,所以我想我会在这里分享它。bVal 从trigger 中获取布尔值并允许传递taskType。

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
于 2016-01-28T04:51:48.020 回答
1

看看Qt的属性系统。您可以动态添加包含字符串或您想要的任何内容的属性,该属性定义了操作。然后就可以在 slot 中使用 sender() 方法来获取调用 slot 的 QObject。然后,查询您设置的属性并相应地做任何您想做的事情。

但是,这不是最好的方法。不建议使用 sender() ,因为它违反了面向对象的模块化原则。

最好的方法是使用 QSignalMapper 类。此类将来自不同对象的信号映射到具有不同参数的同一槽。

我没有使用过 PyQt,因此我无法为您提供确切的语法或示例,但通过一些研究应该不难找到。

于 2009-09-23T08:03:54.007 回答
1

我试图找出一个类似的问题,在查看了上面的代码之后,这对我有用。觉得把这一切都展示出来会很好。=)

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
于 2011-01-16T03:41:19.193 回答
1

只是一些附加信息,我不知道为什么,但是 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 )  )    

一切安好。使用新的连接语法,您只能获得循环的最后一个元素 :(

于 2013-02-26T21:37:56.703 回答