Domanda

Ho bisogno di essere in grado di sapere quale oggetto che ho cliccato in un sistema di menu generato dinamicamente. Voglio solo sapere quello che ho cliccato su, anche se è semplicemente una rappresentazione di stringa.

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
È stato utile?

Soluzione

Invece di usare onFilmSet direttamente come il destinatario della vostra connessione, utilizzare una funzione lambda in modo da poter passare parametri aggiuntivi:

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

Altri suggerimenti

Date un'occhiata al sistema di proprietà del Qt. È dinamicamente possibile aggiungere una proprietà che contiene una stringa o tutto ciò che desiderate, che definisce l'azione. Quindi è possibile utilizzare mittente () Metodo nello slot per ottenere il QObject chiamando lo slot. Quindi, interrogare la proprietà di impostare e fare quello che vuoi di conseguenza.

Ma, questo non è il metodo migliore per farlo. Utilizzando mittente () non è consigliato perché viola il principio orientato agli oggetti di modularità.

Il metodo migliore sarebbe utilizzando la classe QSignalMapper. Questa classe Mappe segnali da diversi oggetti allo stesso slot con argomenti diversi.

Non ho usato PyQt quindi non posso dare sintassi esatta o un esempio, ma non dovrebbe essere difficile da trovare con un po 'di ricerca.

Stavo cercando di capire un problema simile e dopo aver guardato il codice sopra questo è quello che ha funzionato per me. Ho pensato che sarebbe bene per mostrare tutto insieme. =)

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

Solo alcune informazioni aggiuntive, Non so perché, ma la funzione lambda non funziona con nuova sintassi per i collegamenti PyQt:

Esempio di codice non lavora:

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

Ma se si Subsitute l'ultima riga con la sintassi vecchia connessione stile:

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

Tutto va bene. Con la nuova sintassi di connessione, si ottiene solo l'ultimo elemento del ciclo: (

questo rispondere qui per affrontare questo problema in PyQt5, python3. Non mi piace, la variabile BVAL per essere precisi, come io non lo comprendiamo pienamente, ma c'è voluto molto tempo per trovare così ho pensato di condividerle qui. Il BVAL preleva il valore booleano da scatenato e permette al TaskType da passare.

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top