Pyqt-QMenu动态填充并单击

2024-05-02 05:42:18 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

Tags: 项目字符串selfvalue系统def菜单动态
3条回答

与其直接使用onFilmSet作为连接的接收器,不如使用lambda函数,以便可以传递其他参数:

receiver = lambda film=film: self.onFilmSet(self, film)
self.connect(menuItem_Film, SIGNAL('triggered()'), receiver)

我试图找出一个类似的问题,在看了上面的代码后,这就是我的工作。我觉得一起展示会更好。=)

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

看看Qt的属性系统。可以动态添加包含字符串或任何您想要的内容的属性,该属性定义操作。然后可以在插槽中使用sender()方法获取调用插槽的QObject。然后,查询您设置的属性,并根据需要执行任何操作。

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

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

我没有使用PyQt,因此我不能给出确切的语法或示例,但通过一点研究应该不难找到。

相关问题 更多 >