Pregunta

Tengo que ser capaz de saber lo que el tema que he hecho clic en un sistema de menú generado dinámicamente. Yo sólo quiero saber lo que he hecho clic en, incluso si es simplemente una representación de cadena.

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
¿Fue útil?

Solución

En lugar de utilizar onFilmSet directamente como el receptor de la conexión, utilice una función lambda para que pueda pasar parámetros adicionales:

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

Otros consejos

Tome un vistazo a la propiedad del sistema de Qt. Puede agregar dinámicamente una propiedad que contiene una cadena o cualquier cosa que desee, que define la acción. A continuación, puede utilizar el método remitente () en la ranura para obtener el QObject llamando a la ranura. A continuación, consultar la propiedad de configurar y hacer lo que quiera en consecuencia.

Sin embargo, este no es el mejor método para hacer esto. No se aconseja el uso de remitente () porque viola el principio orientado a objetos de la modularidad.

El mejor método sería el uso de la clase QSignalMapper. Esta clase mapas de señales de diferentes objetos a la misma ranura con diferentes argumentos.

No he utilizado PyQt por lo tanto yo no puedo darle sintaxis exacta o un ejemplo, pero no debería ser difícil de encontrar con un poco de investigación.

Yo estaba tratando de averiguar un problema similar y después de ver el código de arriba esto es lo que funcionó para mí. Pensó que sería bueno para mostrar que todos juntos. =)

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

Sólo un poco de información adicional, No sé por qué, pero la función lambda no funciona con la nueva sintaxis pyqt para las conexiones:

Ejemplo de código no de trabajo:

    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 )  )

Pero si subsitute la última línea con la sintaxis de conexión viejo estilo:

self.connect(actionAssignTo, QtCore.SIGNAL('triggered()'),  lambda userID = user[1] :  self.assignAllTo( userID )  )    

Todo está bien. Con la nueva sintaxis de conexión, que sólo recibe el último elemento del bucle: (

encontré este responder aquí para hacer frente a esta cuestión en PyQt5, python3. No me gusta, la variable bVal para ser más precisos, ya que no entiendo completamente pero tardó mucho tiempo para encontrar, así que pensé que me gustaría compartir aquí. El bVal recoge el valor booleano de disparado y permite que el TaskType que se pasa.

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top