Frage

Ich muss in der Lage sein zu wissen, welche Artikel ich in einem dynamisch generierten Menüsystem geklickt haben. Ich will nur wissen, was ich angeklickt, auch wenn es nur eine String-Darstellung.

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
War es hilfreich?

Lösung

Statt onFilmSet direkt als Empfänger Ihrer Verbindung zu verwenden, eine Lambda-Funktion verwenden, so dass Sie zusätzliche Parameter übergeben können:

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

Andere Tipps

Werfen Sie einen Blick auf die Eigenschaft System von Qt. Sie können dynamisch eine Eigenschaft hinzufügen, einen String oder etwas enthält, die Sie wünschen, die die Aktion definiert. Dann können Sie Absender () -Methode in dem Schlitz verwenden, um die QObject Aufruf den Schlitz zu erhalten. Dann fragen Sie die Eigenschaft, die Sie gesetzt und tun, was Sie entsprechend wollen.

Aber dies ist nicht die beste Methode, dies zu tun. Mit Absender () wird nicht empfohlen, da es das objektorientierte Prinzip der Modularität verletzt.

Die beste Methode wäre QSignalMapper Klasse. Diese Klasse abbildet Signale von verschiedenen Objekten auf den gleichen Schlitz mit verschiedenen Argumenten.

Ich habe nicht verwendet PyQt deshalb kann ich nicht, dass Ihnen genaue Syntax oder ein Beispiel geben, aber es sollte nicht mit einer wenig Forschung zu finden schwer zu.

Ich habe versucht, ein ähnliches Problem, herauszufinden, und erneut nach dem Code darüber suchen ist, was für mich gearbeitet. Ich dachte, es wäre gut, sie alle zusammen zu zeigen. =)

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

Nur ein paar zusätzliche Informationen, Ich weiß nicht, warum, aber Lambda-Funktion funktioniert nicht mit neuer pyqt Syntax für Verbindungen:

Beispiel-Code nicht funktioniert:

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

Aber wenn man die letzte Zeile mit der alten Stil Verbindungssyntax subsitute:

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

Alles ist in Ordnung. Mit der neuen Verbindung Syntax, nur das letzte Element der Schleife erhalten: (

Ich fand diese Antwort hier mit diesem Thema in PyQt5, python3 handelt. Ich mag es nicht, die bVal Variable um genau zu sein, da ich nicht ganz verstehen kann, aber es dauerte eine lange Zeit zu finden, so dachte ich, dass ich sie hier teilen würde. Der bVal nimmt den Booleschen Wert von ausgelöst und lässt den Tasktype übergeben werden.

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top