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