[PyQt4] lambda in QObject.connect()
Verfasst: Samstag 16. August 2008, 14:34
Hallo,
ich habe eine Widget-Klasse für PyQt4 geschrieben, die mehrere QPushButtons mit Checkable=True tabellarisch angeordnet erzeugt. Dabei habe ich der Einfachheit halber im connect, das das toggeled()-Signal vom Button mit einer Funktion in der Klasse verbindet, eine lambda-Funktion benutzt, damit ich QPushButton nicht ableiten muss um die Koordinaten des angeklickten Buttons zu übermitteln.
Seltsamerweise habe ich beim Testlauf mit einer 5x5-Matrix immer die Ausgabe (also dass der letzte Button unten rechts angeklickt wurde) bekommen, egal welchen Button ich anklickte.
Ich kann mir das Ergebnis einfach nicht erklären, es wird ja für jeden Button eine eigene Lambda-Funktion erzeugt, die auch andere Koordinaten enthält, trotzdem erzeugt jeder Button die gleiche Ausgabe.
Hat hier jemand eine Idee, woran das liegen könnte?
ich habe eine Widget-Klasse für PyQt4 geschrieben, die mehrere QPushButtons mit Checkable=True tabellarisch angeordnet erzeugt. Dabei habe ich der Einfachheit halber im connect, das das toggeled()-Signal vom Button mit einer Funktion in der Klasse verbindet, eine lambda-Funktion benutzt, damit ich QPushButton nicht ableiten muss um die Koordinaten des angeklickten Buttons zu übermitteln.
Seltsamerweise habe ich beim Testlauf mit einer 5x5-Matrix immer die Ausgabe
Code: Alles auswählen
TOGGLED: 4 4 True
Ich kann mir das Ergebnis einfach nicht erklären, es wird ja für jeden Button eine eigene Lambda-Funktion erzeugt, die auch andere Koordinaten enthält, trotzdem erzeugt jeder Button die gleiche Ausgabe.
Hat hier jemand eine Idee, woran das liegen könnte?
Code: Alles auswählen
class Widget (QtGui.QWidget):
def __init__(self, width, height, parent=None):
super(Widget, self).__init__(parent)
layout = QtGui.QGridLayout(self)
widgets = []
for x in xrange(width):
xlist = []
for y in xrange(height):
obj = QtGui.QPushButton('%i,%i'%(x,y), self)
self.connect(obj, SIGNAL('toggled(bool)'), lambda checked: self._toggled(x,y,checked))
layout.addWidget(obj, y, x)
obj.setCheckable(True)
xlist.append( obj )
widgets.append(xlist)
def _toggled(self, x, y, checked):
print 'TOGGLED:', x,y,checked