PyQt - Signale & Slots
Im Gegensatz zu einer Anwendung im Konsolenmodus, die sequentiell ausgeführt wird, ist eine GUI-basierte Anwendung ereignisgesteuert. Funktionen oder Methoden werden als Reaktion auf Benutzeraktionen wie das Klicken auf eine Schaltfläche, das Auswählen eines Elements aus einer Sammlung oder einen Mausklick usw. ausgeführtevents.
Widgets, die zum Erstellen der GUI-Schnittstelle verwendet werden, dienen als Quelle für solche Ereignisse. Jedes PyQt-Widget, das von der QObject-Klasse abgeleitet ist, ist für die Ausgabe von 'signal'als Antwort auf ein oder mehrere Ereignisse. Das Signal alleine führt keine Aktion aus. Stattdessen ist es mit einem 'verbunden'slot'. Der Steckplatz kann beliebig seincallable Python function.
In PyQt kann die Verbindung zwischen einem Signal und einem Steckplatz auf verschiedene Arten hergestellt werden. Im Folgenden sind die am häufigsten verwendeten Techniken aufgeführt:
QtCore.QObject.connect(widget, QtCore.SIGNAL(‘signalname’), slot_function)
Eine bequemere Möglichkeit, eine slot_function aufzurufen, wenn ein Signal von einem Widget ausgegeben wird, ist wie folgt:
widget.signal.connect(slot_function)
Angenommen, eine Funktion soll aufgerufen werden, wenn auf eine Schaltfläche geklickt wird. Hier soll das angeklickte Signal mit einer aufrufbaren Funktion verbunden werden. Es kann in einer der folgenden zwei Techniken erreicht werden -
QtCore.QObject.connect(button, QtCore.SIGNAL(“clicked()”), slot_function)
oder
button.clicked.connect(slot_function)
Beispiel
Im folgenden Beispiel werden zwei QPushButton-Objekte (b1 und b2) im QDialog-Fenster hinzugefügt. Wir wollen die Funktionen b1_clicked () und b2_clicked () aufrufen, wenn wir auf b1 bzw. b2 klicken.
Wenn auf b1 geklickt wird, wird das clicked () -Signal mit der Funktion b1_clicked () verbunden
b1.clicked.connect(b1_clicked())
Wenn auf b2 geklickt wird, wird das Signal clicked () mit der Funktion b2_clicked () verbunden
QObject.connect(b2, SIGNAL("clicked()"), b2_clicked)
Beispiel
import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *
def window():
app = QApplication(sys.argv)
win = QDialog()
b1 = QPushButton(win)
b1.setText("Button1")
b1.move(50,20)
b1.clicked.connect(b1_clicked)
b2 = QPushButton(win)
b2.setText("Button2")
b2.move(50,50)
QObject.connect(b2,SIGNAL("clicked()"),b2_clicked)
win.setGeometry(100,100,200,100)
win.setWindowTitle("PyQt")
win.show()
sys.exit(app.exec_())
def b1_clicked():
print "Button 1 clicked"
def b2_clicked():
print "Button 2 clicked"
if __name__ == '__main__':
window()
Der obige Code erzeugt die folgende Ausgabe -
Ausgabe
Button 1 clicked
Button 2 clicked