PyQt - Segnali e slot
A differenza di un'applicazione in modalità console, che viene eseguita in modo sequenziale, un'applicazione basata su GUI è guidata dagli eventi. Funzioni o metodi vengono eseguiti in risposta alle azioni dell'utente come fare clic su un pulsante, selezionare un elemento da una raccolta o un clic del mouse ecc., Chiamatoevents.
I widget utilizzati per costruire l'interfaccia GUI fungono da fonte di tali eventi. Ogni widget PyQt, derivato dalla classe QObject, è progettato per emettere 'signal'in risposta a uno o più eventi. Il segnale da solo non esegue alcuna azione. Invece, è "connesso" a un "slot'. Lo slot può essere qualsiasicallable Python function.
In PyQt, la connessione tra un segnale e uno slot può essere ottenuta in diversi modi. Di seguito sono riportate le tecniche più comunemente utilizzate:
QtCore.QObject.connect(widget, QtCore.SIGNAL(‘signalname’), slot_function)
Un modo più conveniente per chiamare una funzione slot_, quando un segnale viene emesso da un widget è il seguente:
widget.signal.connect(slot_function)
Supponiamo che una funzione debba essere chiamata quando si fa clic su un pulsante. Qui, il segnale cliccato deve essere collegato a una funzione richiamabile. Può essere ottenuto in una delle seguenti due tecniche:
QtCore.QObject.connect(button, QtCore.SIGNAL(“clicked()”), slot_function)
o
button.clicked.connect(slot_function)
Esempio
Nell'esempio seguente, vengono aggiunti due oggetti QPushButton (b1 e b2) nella finestra QDialog. Vogliamo chiamare le funzioni b1_clicked () e b2_clicked () facendo clic rispettivamente su b1 e b2.
Quando si fa clic su b1, il segnale cliccato () è collegato alla funzione b1_clicked ()
b1.clicked.connect(b1_clicked())
Quando si fa clic su b2, il segnale cliccato () è collegato alla funzione b2_clicked ()
QObject.connect(b2, SIGNAL("clicked()"), b2_clicked)
Esempio
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()
Il codice precedente produce il seguente output:
Produzione
Button 1 clicked
Button 2 clicked