PyQt - 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 widżet PyQt, który jest pochodną klasy QObject, jest przeznaczony do emitowania '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.

W PyQt połączenie między sygnałem a gniazdem można uzyskać na różne sposoby. Poniżej przedstawiono najczęściej używane techniki -

QtCore.QObject.connect(widget, QtCore.SIGNAL(‘signalname’), slot_function)

Wygodniejszy sposób wywołania funkcji slot_function, gdy sygnał jest emitowany przez widżet, jest następujący:

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 dwóch technik -

QtCore.QObject.connect(button, QtCore.SIGNAL(“clicked()”), slot_function)

lub

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 ()

QObject.connect(b2, SIGNAL("clicked()"), b2_clicked)

Przykład

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()

Powyższy kod daje następujące dane wyjściowe -

Wynik

Button 1 clicked
Button 2 clicked