PyQt5 - sygnały i sloty
W przeciwieństwie do aplikacji w trybie konsoli, która jest wykonywana w sposób sekwencyjny, aplikacja oparta na graficznym interfejsie użytkownika jest sterowana zdarzeniami. Funkcje lub metody są wykonywane w odpowiedzi na działania użytkownika, takie jak kliknięcie przycisku, wybranie elementu z kolekcji lub kliknięcie myszą itp., Nazywaneevents.
Źródłem takich zdarzeń są widżety użyte do zbudowania interfejsu GUI. Każdy widget PyQt wywodzący się z klasy QObject jest przeznaczony do emisji‘signal’w odpowiedzi na jedno lub więcej wydarzeń. Sam sygnał nie wykonuje żadnej akcji. Zamiast tego jest „podłączony” do‘slot’. Slot może być dowolnycallable Python function.
Korzystanie z edytora sygnałów / gniazd Qt Designer
Najpierw zaprojektuj prosty formularz z kontrolką LineEdit i przyciskiem PushButton.
Pożądane jest, aby po naciśnięciu przycisku zawartość pola tekstowego została skasowana. W tym celu widget QLineEdit ma metodę clear (). Stąd przyciskclicked sygnał ma być podłączony clear() metoda pola tekstowego.
Aby rozpocząć, wybierz Edit signal / slots z menu Edit (lub wciśnij F4). Następnie zaznacz przycisk myszą i przeciągnij kursor w kierunku pola tekstowego
Po zwolnieniu przycisku myszy zostanie wyświetlone okno dialogowe pokazujące sygnały przycisku i metody gry. Wybierz metodę klikniętego sygnału i wyczyść ()
Wynik w oknie edytora sygnału / gniazd w prawym dolnym rogu pokaże -
Zapisz interfejs użytkownika oraz kod kompilacji i języka Python z pliku interfejsu użytkownika, jak pokazano w poniższym kodzie -
pyuic5 -x signalslot.ui -o signalslot.py
Wygenerowany kod w Pythonie będzie miał połączenie między sygnałem a gniazdem za pomocą następującej instrukcji -
self.pushButton.clicked.connect(self.lineEdit.clear)
Uruchom signallot.py i wprowadź jakiś tekst w LineEdit. Tekst zostanie wyczyszczony po naciśnięciu przycisku.
Budowanie połączenia gniazda sygnałowego
Zamiast korzystać z Projektanta, możesz bezpośrednio nawiązać połączenie z gniazdem sygnałowym, stosując składnię -
widget.signal.connect(slot_function)
Załóżmy, że funkcja ma zostać wywołana po kliknięciu przycisku. W tym przypadku kliknięty sygnał ma być podłączony do wywoływanej funkcji. Można to osiągnąć za pomocą dowolnej z następujących technik -
button.clicked.connect(slot_function)
Przykład
W poniższym przykładzie dwa obiekty QPushButton (b1 i b2) zostały dodane w oknie QDialog. Chcemy wywołać funkcje b1_clicked () i b2_clicked () po kliknięciu odpowiednio b1 i b2.
Po kliknięciu b1 sygnał clicked () jest łączony z funkcją b1_clicked () -
b1.clicked.connect(b1_clicked())
Po kliknięciu b2 sygnał clicked () jest łączony z funkcją b2_clicked ().
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()
Powyższy kod daje następujące dane wyjściowe -
Wynik
Button 1 clicked
Button 2 clicked