PyQt: gestire i segnali dei vari widget


Posted: marzo 28th, 2011 | Author: | Filed under: Guide, Programmazione | Tags: , , , , , , , , , , , , | No Comments »


In questo secondo creiamo una applicazione semplice ma completa, con la quale impariamo a gestire i vari segnali dei widget.

I segnali sono un elemento molto importante della programmazione a finestre. Essi sono degli eventi generati dai vari widget quando vengono eseguite determinate operazioni. Per esempio se una applicazione ha un bottone, ed esso viene premuto dall’utente, viene generato un segnale che identifica l’operazione che è stata eseguita (il click del mouse sul bottone), ed in più può contenere altre informazioni.

Un segnale per essere gestito ha bisogno di essere connesso ad uno Slot. Uno slot è una funzione  (che in PyQt non ha bisogno di particolare sintassi al contrario del C++/Qt). Per connettere un segnale ad uno slot occorre utilizzare l’apposito metodo di QObject connect. È inoltre possibile emettere segnali utilizzando il metodo emit.

La nostra applicazione è composta da una QLineEdit, una QPlainTextEdit, una QTextEdit e due QPushButton. La differenza tra i due text editor è sostanziale: il primo (QPlainTextEdit) supporta solo normale testo, mentre il secondo (QTextEdit) supporta sia testo normale che testo formattato, utilizzando alcuni tag html.

Il layout è molto semplice ed è quella mostrata nella Fig. 1:

Fig. 1: La finestra del nostro programma

Non ci soffermemo sulla sua creazione, è possibile scaricare il file UI insieme ai restanti sorgenti qui. Si suppone anche di aver già creato, tramite pyuic4, il file MainWindow_Ui.py. Se avete dubbi sia su come creare il layout sia su come utilizzare pyuic4 vi rimando al precedente articolo Creare un layout per una applicazione PyQt con QtCreator.

Analizziamo come procedere nella creazione del nostro progetto.

from PyQt4 import QtCore, QtGui
import sys
from MainWindow_Ui import *                                                                                                                                                                                                      

class MainWindow (object):                                                                                                                                                                                                       

        def __init__(self):
                self.app = QtGui.QApplication([])
                self.Dialog = QtGui.QMainWindow()
                self.ui = Ui_MainWindow()
                self.ui.setupUi(self.Dialog)
                self.connections()                                                                                                                                                                                               

        def connections(self):
                #BUTTON CONNECTIONS
                self.app.connect(self.ui.insertButton, QtCore.SIGNAL("clicked()"), self.insert)
                self.app.connect(self.ui.clearButton, QtCore.SIGNAL("clicked()"), self.clear)                                                                                                                                    

                self.app.connect(self.ui.textEdit, QtCore.SIGNAL("textChanged ()"), self.toHtml)                                                                                                                                 

        def run(self):
                self.Dialog.show()
                self.app.exec_()                                                                                                                                                                                                 

        def clear(self):
                self.ui.textEdit.clear()
                self.ui.htmlEdit.clear()                                                                                                                                                                                         

        def insert(self):
                if self.ui.textLine.text() != "":
                        self.ui.textEdit.insertPlainText(self.ui.textLine.text() + "\n")
                        self.ui.textLine.clear()                                                                                                                                                                                 

        def toHtml(self):
                self.ui.htmlEdit.setHtml(self.ui.textEdit.toPlainText())

if __name__ == "__main__":
        window = MainWindow()
        window.run()

Questo codice (che includeremo in un file chiamato MainWindow.py) è il cuore della nostra applicazione. In particolare la funzione self.connections() non fa altro che collegare i vari segnali gestiti ai vari slot (self.insert, self.clear, self.toHtml). Analizziamo solo una delle connessioni:

self.app.connect(self.ui.insertButton, QtCore.SIGNAL("clicked()"), self.insert)

Il primo parametro della connect è il widget che emette il segnale (in questo caso il nostro bottone con l’etichetta insert), il secondo caso è il tipo di segnale emesso (il click del mouse appunto) ed il terzo parametro è lo slot a cui connettere il segnale.

Per avere la lista di tutti i segnali supportati da ciascun widget si può utilizzare la documentazione ufficiale http://doc.qt.nokia.com/3.3/qbutton.html (del QButton in questo caso).

Non ci soffermiamo sull’analisi delle funzioni svolte dai vari slot data la loro semplicità.

Non ci resta che avviare il programma per osservarne il funzionamento:

Fig.2: Come funziona il programma

Come abbiamo visto, utilizzare i segnali per gestire i vari eventi che si generano sulla GUI non è per niente una operazione difficile. Vi ricordo che potete scaricare tutti i sorgenti da questo link.

Al prossimo articolo!



Leave a Reply

  • Articoli Recenti:

  • Tag

  • Categorie

  • Meta

  • Licenza Creative Commons

    Copyright © 2018, | ldlabs.org – Blog is proudly powered by WordPress All rights Reserved | Theme by Ryan McNair modified By Francesco Apollonio

    Smilla Magazine Il Bloggatore iwinuxfeed.altervista.org Feedelissimo - tecnologia WebShake - tecnologia