PyQt5 - 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 ausgelegt‘signal’als Reaktion auf ein oder mehrere Ereignisse. Das Signal alleine führt keine Aktion aus. Stattdessen ist es mit a verbunden‘slot’. Der Steckplatz kann beliebig seincallable Python function.

Verwenden des Signal- / Slot-Editors von Qt Designer

Entwerfen Sie zunächst ein einfaches Formular mit einem LineEdit-Steuerelement und einem PushButton.

Wenn die Taste gedrückt wird, sollte der Inhalt des Textfelds gelöscht werden. Das QLineEdit-Widget verfügt zu diesem Zweck über eine clear () -Methode. Daher der Knopfclicked Signal ist anzuschließen clear() Methode des Textfeldes.

Wählen Sie zunächst im Menü Bearbeiten die Option Signale / Slots bearbeiten (oder drücken Sie F4). Markieren Sie dann die Schaltfläche mit der Maus und ziehen Sie den Cursor in Richtung Textfeld

Wenn die Maus losgelassen wird, wird ein Dialogfeld mit Schaltflächensignalen und Slot-Methoden angezeigt. Wählen Sie das angeklickte Signal und die Methode clear ()

Das Fenster Signal / Slot Editor unten rechts zeigt das Ergebnis -

Speichern Sie den UI- und Build- und Python-Code aus der UI-Datei, wie im folgenden Code gezeigt -

pyuic5 -x signalslot.ui -o signalslot.py

Generierter Python-Code hat die Verbindung zwischen Signal und Slot durch die folgende Anweisung:

self.pushButton.clicked.connect(self.lineEdit.clear)

Führen Sie signallot.py aus und geben Sie Text in das LineEdit ein. Der Text wird gelöscht, wenn die Taste gedrückt wird.

Aufbau einer Signalsteckplatzverbindung

Anstatt Designer zu verwenden, können Sie die Signal-Slot-Verbindung direkt herstellen, indem Sie die folgende Syntax verwenden:

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 jeder der folgenden Techniken erreicht werden -

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.

import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets 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)
   b2.clicked.connect(b2_clicked)
   
   win.setGeometry(100,100,200,100)

   win.setWindowTitle("PyQt5")
   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