PyQt5 - 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. Ciascun 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 file‘slot’. Lo slot può essere qualsiasicallable Python function.
Utilizzo dell'editor di segnali / slot di Qt Designer
Per prima cosa progetta un form semplice con un controllo LineEdit e un PushButton.
Si desidera che se si preme il pulsante, il contenuto della casella di testo venga cancellato. Il widget QLineEdit ha un metodo clear () per questo scopo. Quindi, il pulsanteclicked il segnale deve essere collegato clear() metodo della casella di testo.
Per iniziare, scegli Modifica segnali / slot dal menu Modifica (o premi F4). Quindi evidenzia il pulsante con il mouse e trascina il cursore verso la casella di testo
Quando il mouse viene rilasciato, verrà visualizzata una finestra di dialogo che mostra i segnali del pulsante e i metodi di slot. Selezionare il segnale cliccato e il metodo clear ()
La finestra Signal / Slot Editor in basso a destra mostrerà il risultato:
Salva l'interfaccia utente e il codice Build e Python dal file ui come mostrato nel codice seguente -
pyuic5 -x signalslot.ui -o signalslot.py
Il codice Python generato avrà la connessione tra il segnale e lo slot dalla seguente istruzione:
self.pushButton.clicked.connect(self.lineEdit.clear)
Esegui signallot.py e inserisci del testo in LineEdit. Il testo verrà cancellato se si preme il pulsante.
Collegamento dello slot del segnale di costruzione
Invece di utilizzare Designer, puoi stabilire direttamente la connessione allo slot del segnale seguendo la sintassi:
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 con una qualsiasi delle seguenti tecniche:
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 ().
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()
Il codice precedente produce il seguente output:
Produzione
Button 1 clicked
Button 2 clicked