Home > PyQt5, python > PyQt5: QApplication

PyQt5: QApplication

29 Maggio 2019

Torna all’indice degli appunti

QApplication

QApplication è la classe che gestisce i settaggi ed il flusso della UI della nostra applicazione.
La cosa fondamentale è che QApplication, contiene l’event_loop, dove vengono gestiti tutti gli eventi relativi alla main window e gestisce l’inizializzazione dell’applicazione. Ad ogni Applicazione con UI, corrisponde un oggetto QApplication.

Le responsabilità principali dell’oggetto QApplication sono:

– inizializzare l’applicazione con settaggi utente quali, palette, font e doubleClickInterval;
– esegue l’event-handling, ovvero riceve segnali dal window-system e li distribuisce ai widget interessati;
– accetta parametri da riga di comando e si regola in funzione di essi;
– può definire il look and feel dell’applicazione;
– fornisce la localizzazione delle stringhe visibili all’utente (traslate);
– mette a disposizione oggetti come desktop e clipboard;
– sa tutto delle finestre dell’applicazione: quale widget è in una determinata posizione, chi sono i TopLevel Widgets, può chiudere tutte le finestre, ecc;

SETTINGS

Come detto al punto 1, è possibile cambiare alcuni settaggi fondamentali dell’applicazione, come ad esempio palette, istanza della classe QPalette che contiene i gruppi di colori che indicano lo stato di ogni widget (Active, Inactive, Disabled).
Per ottenere l’oggetto palette dell’applicazione, si utilizza il metodo palette:

>>> from PyQt5.QtWidgets import QApplication
>>> from PyQt5.QtGui import QPalette, QColor
>>> app = QApplication([])
>>> palette = app.palette()

Con il metodo color(color_role), dove color_role è un QPalette ColorRole-enum, si ottiene l’oggetto QColor utilizzato dalla applicazione:

>>> palette.color(QPalette.Window).name()
'#f0f0f0'

per modificare il colore del role, si utilizza il metodo setColor(color_role, color), dove color_role è il ColorRole-enum, mentre color, l’oggetto QColor che vogliamo impostare:

>>> palette.setColor(QPalette.Window, QColor("aquamarine"))
>>> palette.color(QPalette.Window).name()
'#7fffd4'
>>> app.setPalette(palette)

In effetti, consideriamo il semplice codice:

from PyQt5.QtWidgets import QMainWindow
from PyQt5.QtWidgets import QApplication, QWidget
from PyQt5.QtGui import QColor, QPalette
import sys


class MainWindow(QMainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.setWindowTitle("QApplication Example")
        self.resize(200, 150)
        self.central_widget = FormWidget(self)
        self.setCentralWidget(self.central_widget)


class FormWidget(QWidget):
    def __init__(self, parent):
        super(FormWidget, self).__init__(parent)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    main_window = MainWindow(parent=None)
    main_window.show()
    sys.exit(app.exec_())

modificando il QPalette.Window:

...

if __name__ == '__main__':
    app = QApplication(sys.argv)
    palette = app.palette()
    palette.setColor(QPalette.Window, QColor("aquamarine"))
    app.setPalette(palette)
    main_window = MainWindow(parent=None)
    main_window.show()
    sys.exit(app.exec_())

Lo stesso discorso vale per il settaggio di altri parametri, come ad esempio in font utilizzato dalla applicazione.

ISTANZA DI QApplication

Per ottenere l’oggetto QApplication ovunque all’interno del codice, è possibile chiamare il metodo instance() della classe QApplication:

>>> app.name_ = "bancaldo"
>>> app_ = QApplication.instance()
>>> app_ == app
True
>>> app_.name_
'bancaldo'

EVENT HANDLING

Per entrare nell’event loop si utilizza il metodo exec_(), da questo momento l’applicazione riceve gli eventi dal window-system e li distribuisce ai vari widgets. exec_() rimane nel main loop fino a chè non viene chiamato il metodo exit().

argv

Tutti i programmi Qt supportano i seguenti parametri da riga di comando:

-style= setta lo stile della UI dell’applicazione. I tipi di stile dipendono dalla configurazione di sistema;
-stylesheet= setta lo stylesheet della applicazione;
-reverse setta il layout dell’applicazione a Qt.RightToLeft;

per sapere quali argomenti sono settati per la app corrente, si utilizza il metodo arguments():

Lista Top Level Widgets

E’ possibile conoscere quali sono i Top Level Widgets, con il metodo topLevelWidgets() di QApplication:

>>> from PyQt5.QtWidgets import QApplication, QMainWindow
>>> app = QApplication([])
>>> mw = QMainWindow()
>>> app.topLevelWidgets()
[<PyQt5.QtWidgets.QMainWindow object at 0x0360E170>]

DESKTOP

il metodo desktop() ritorna un oggetto QDesktopWidget che rappresenta la root-window, ovvero il nostro desktop.
Può essere comodo conoscere le dimensioni del nostro desktop nel momento in cui dobbiamo dimensionare le finestre della nostra applicazione, sopratutto quando si ha a che fare con un doppio schermo e desktop esteso.
L’oggetto QDesktopWidget mette a disposizione due comodi metodi:

screenGeometry(): ritorna le dimensioni dello schermo;
availableGeometry(): ritorna le dimensioni diponibili (desktop);

>>> desktop = app.desktop()
>>> desktop.screenGeometry()
PyQt5.QtCore.QRect(0, 0, 1680, 1050)
>>> desktop.availableGeometry()
PyQt5.QtCore.QRect(0, 0, 1680, 1010)

CLIPBOARD

Con il metodo clipboard() otteniamo un oggetto QClipboard che ci dà l’accesso al clipboard di sistema.
E’ possibile ad esempio effettuare un semplice copia/incolla di dati, tra diverse applicazioni.
Testi, immagini, mimedata, pixmap, si portano sul clipboard con i metodi setText(text), setImage(image), setMimeData(data), setPixmap(pixmap).
Per recuperarli invece si utilizzano i metodi text(), image(), mimeData()e pixmap().

ABOUT QT

Chiamando il metodo aboutQt(), viene visualizzato un message box che indica la versione di Qt in uso.
Utile da inserire nel menu Help dell’applicazione.

ALL WIDGETS

Con il metodo allWidgets(), avremo una lista di tutti i widgets impiegati nella stessa:

>>> from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget
>>> app = QApplication([])
>>> mw = QMainWindow()
>>> for n in range(5):
...     w = QWidget(parent=mw)
...     
>>> app.allWidgets()
[<PyQt5.QtWidgets.QWidget object at 0x0372E170>, ...
>>> len(app.allWidgets()
6

BEEP

Con il metodo beep() viene appunto emesso un beep con suono e volume di default.

CLOSE ALL WINDOWS

Per chiudere tutte le top level windows, si utilizza il metodo closeAllWindows()

WHEEL SCROLL LINES

Di default il numero di scroll lines è 3 e lo si può vedere con il metodo wheelScrollLines():

>>> app.wheelScrollLines()
3

Per modificare tale numero è sufficiente chiamare il metodo setWheelScrollLines(num):

>>> app.setWheelScrollLines(5)
>>> app.wheelScrollLines()
5

ICONA

E’ possibile modificare l’icona della finestra dell’applicazione, invocando il metodo setWindowIcon(icon), dove icon è un oggetto QIcon contenete l’immagine desiderata. Per ottenere invece l’icona dell’applicazione si utilizza il metodo windowIcon():

>>> from PyQt5.QtGui import QIcon
>>> icon = QIcon("qt.png")
>>> app.setWindowIcon(icon)
>>> app.windowIcon()
<PyQt5.QtGui.QIcon object at 0x0372E3A0>

Torna all’indice degli appunti

Categorie:PyQt5, python Tag: ,
I commenti sono chiusi.