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