Home > PyQt5, python > PyQt5: QMessageBox

PyQt5: QMessageBox

23 Aprile 2019

Torna all’indice degli appunti

QPlainTextEdit

Il widget QMessageBox è una sottoclasse dell’oggetto QDialog e permette di dare informazioni all’utente (es. errori), o fare delle domande (“Sicuro sì/no” ecc).
Un message box è costituito da:

primary text: un testo principale, che avvisa l’utente su una determinata situazione;
informative text: testo informativo per spiegare il tipo di alert, o per porre una domanda all’utente;
detailed text: un testo dettagliato per fornire ulteriori informazioni, se richieste dall’utente.
icona: l’icona mostrata nel message box;
standard button: bottoni per permettere all’utente di dare una risposta.

Per creare un message box è molto semplice, si utilizza il costruttore QMessageBox e, una volta creato l’oggetto, si utilizza il metodo
setText(text)
Per dare un titolo alla finestra del messaggio, si utilizza il metodo setWindowTitle(text).
Per visualizzare il message box si utilizza il metodo exec:

>>> from PyQt5.QtWidgets import QApplication, QMessageBox
>>> app = QApplication([])
>>> mbox = QMessageBox()
>>> mbox.setWindowTitle("Message Box")
>>> mbox.setText("Message text")
>>> mbox.exec()

Nota:

Il metodo exec ritorna il valore del pulsante che viene premuto.
I valori del pulsanti standard sono reperibili sul sito ufficiale.
Nell’esempio precedente, premendo sul pulsante OK, oltre alla distruzione del message box, verrà ritornato il valore 1024.
Il valore dello standard button QMessageBox.Ok è infatti 0x00000400 ovvero 4*16^2.

Vediamo come si aggiungono l’informative text, il detailed text e i pulsanti condizionali.
l’Informative text si aggiunge con il metodo l’setInformativeText(text), il l’detailed text, con il metodo setDetailedText(text) e i pulsanti con il metodo setStandardButtons(buttons), dove buttons può essere un singolo pulsante o una union di più pulsanti.

Gli standard buttons disponibili sono:

QMessageBox.Ok
QMessageBox.Open
QMessageBox.Save
QMessageBox.Cancel
QMessageBox.Close
QMessageBox.Discard
QMessageBox.Apply
QMessageBox.Reset
QMessageBox.RestoreDefaults
QMessageBox.Help
QMessageBox.SaveAll
QMessageBox.Yes
QMessageBox.YesToAll
QMessageBox.No
QMessageBox.NoToAll
QMessageBox.Abort
QMessageBox.Retry
QMessageBox.Ignore

>>> mbox.setWindowTitle("Save Dialog")
>>> mbox.setText("Document has been modified!")
>>> mbox.setInformativeText("Do you want to save your changes?")
>>> mbox.setDetailedText("Click on Save button to save changes.")
>>> mbox.setStandardButtons(QMessageBox.Save | QMessageBox.Discard | QMessageBox.Cancel)
>>> mbox.exec()

Cliccando sul pulsante Show details otterremo il messaggio supplementare come in figura:

E’ possibile anche aggiungere gli standard buttons manualmente con il metodo addButton(standardButton) che ritorna
lo standard button appena aggiunto. Questo riferimento è utile nel momento in cui lo si vorrà eliminare con il metodo removeButton(standardButton)
Qualora non si avesse un riferimento al bottone, è possibile ottenere la lista dei bottoni presenti nel message box, con il metodo buttons.

>>> mbox.addButton(QMessageBox.Save)
<PyQt5.QtWidgets.QPushButton object at 0x035FE6C0>
>>> mbox.buttons()
[<PyQt5.QtWidgets.QPushButton object at 0x035FE800>, <PyQt5.QtWidgets.QPushButton object at 0x035FE6C0>]
>>> save_button = mbox.buttons()[1]
>>> save_button.text()
'Save'
>>> mbox.removeButton(save_button)
>>> mbox.buttons()
[<PyQt5.QtWidgets.QPushButton object at 0x035FE530>]

ICONA

E’ possibile assegnare al message box un’icona che indichi il livello di importanza del messaggio.
Il tipi di messaggio che solitamente si usano sono 4: Question, Information, Warning, Critical.
Di default il message box è impostato per non mostrare alcuna icona, per agire diversamente si utilizzano i metodi:

setIcon(standardIcon): fornisce una delle icon standard al message box;
setIconPixmap(customIcon): fornisce una icona personalizzata al message box;

Le standard icon sono le seguenti:

QMessageBox.Question
QMessageBox.Information
QMessageBox.Warning
QMessageBox.Critical

>>> mbox.setIcon(QMessageBox.Warning)
>>> mbox.exec()

STATIC FUNCTIONS

La costruzione dell’oggetto message box può avvenire in un colpo solo, grazie all’utilizzo dell static functions della classe
QMessageBox. Sono esattamente 4, come il tipo di messaggio che si vuole creare:

question, information, warning, critical.
In un colpo solo è possibile passare a tali metodi il parent, la il window title, il text e la union dei pulsanti:

>>> QMessageBox.warning(None, "Save Dialog", "The document has been modified.\nDo You want to save your changes",
...                     QMessageBox.Save | QMessageBox.Discard | QMessageBox.Cancel)

SEGNALI

Come detto in una nota precedente è possibile risalire al pulsante premuto, facendo riferimento al valore ritornato dal metodo exec.
Oppure connettiamo il segnale buttonClicked, segnale emesso quando clicchiamo su un bottone del message box.
E’ molto importante che la connessione del segnale allo slot di competenza, avvenga PRIMA della chiamata al metodo exec, che distruggerebbe altrimenti l’oggetto message box.

Nota:
Come indicato sul sito ufficiale il segnale buttonClicked viene emesso ogni volta che un bottone viene cliccato all’interno del message box e il bottone cliccato viene ritornato come parametro button, accessibile pertanto dallo slot collegato al segnale stesso:

from PyQt5.QtWidgets import QMainWindow
from PyQt5.QtWidgets import (QWidget, QApplication, QBoxLayout, QPushButton,
                             QMessageBox)
import sys


class MainWindow(QMainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.setWindowTitle("QMessageBox Example")
        self.central_widget = FormWidget(self) 
        self.setCentralWidget(self.central_widget)
        self.resize(250, 100)


class FormWidget(QWidget):
    def __init__(self, parent):
        super(FormWidget, self).__init__(parent)
        layout = QBoxLayout(QBoxLayout.TopToBottom)
        self.setLayout(layout)
        button = QPushButton("SAVE")
        layout.addWidget(button, 0)

        button.clicked.connect(self.on_button)

    def on_button(self):
        box = QMessageBox()
        box.buttonClicked.connect(self.on_message_button)
        box.setWindowTitle("Save Dialog")
        box.setText("The document has been modified!")
        box.setInformativeText("Do you want to save changes?")
        box.setIcon(QMessageBox.Warning)
        box.setStandardButtons(QMessageBox.Save | QMessageBox.Discard |
                               QMessageBox.Cancel)
        box.exec()

    def on_message_button(self, button):
        print("[SIG] button <%s> clicked!" % button.text())


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

Torna all’indice degli appunti

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