Comunicare con l’utente

Questa sezione mostra alcuni metodi ed elementi che dovrebbero essere usati per comunicare con l’utente, in modo da mantenere la consistenza nell’interfaccia utente.

Mostrare i messaggi. La classe class:QgsMessageBar.

Utilizzare il box dei messaggi potrebbe essere una cattiva idea dal punto di vista dell’esperienza utente. Solitamente, per mostrare un messaggio di informazione o di errore/avvertimento, la barra dei messaggi di QGIS é l’opzione migliore.

Utilizzando il riferimento all’oggetto interfaccia di QGIS, é possibile mostrare un messaggio nell barra dei messaggi utilizzando il seguente codice

iface.messageBar().pushMessage("Error", "I'm sorry Dave, I'm afraid I can't do that", level=QgsMessageBar.CRITICAL)
../../_images/errorbar.png

Barra dei messaggi di QGIS

É possibile impostare una durata per mostrarlo per un tempo limitato

iface.messageBar().pushMessage("Error", ""Ooops, the plugin is not working as it should", level=QgsMessageBar.CRITICAL, duration=3)
../../_images/errorbar-timed.png

Barra dei messaggi di QGIS con timer

L’esempio precedente mostra una barra d’errore, ma il parametro livello puó essere usato per creare messaggi di avvertimento o di informazione, utilizzando rispettivamente le costanti QgsMessageBar.WARNING e QgsMessageBar.INFO`.

../../_images/infobar.png

Barra dei messaggi di QGIS (informazioni)

I widget possono essere aggiunti alla barra dei messaggi, ad esempio il pulsante per mostrare piú informazioni

def showError():
    pass

widget = iface.messageBar().createMessage("Missing Layers", "Show Me")
button = QPushButton(widget)
button.setText("Show Me")
button.pressed.connect(showError)
widget.layout().addWidget(button)
iface.messageBar().pushWidget(widget, QgsMessageBar.WARNING)
../../_images/bar-button.png

Barra dei messaggi di QGIS con un pulsante

É possibile usare una barra dei messaggi nella propria finestra di dialogo senza dover mostrare una finestra di messaggi, o nel caso in cui non abbia senso mostrarla nella finestra principale di QGIS.

class MyDialog(QDialog):
    def __init__(self):
        QDialog.__init__(self)
        self.bar = QgsMessageBar()
        self.bar.setSizePolicy( QSizePolicy.Minimum, QSizePolicy.Fixed )
        self.setLayout(QGridLayout())
        self.layout().setContentsMargins(0, 0, 0, 0)
        self.buttonbox = QDialogButtonBox(QDialogButtonBox.Ok)
        self.buttonbox.accepted.connect(self.run)
        self.layout().addWidget(self.buttonbox, 0, 0, 2, 1)
        self.layout().addWidget(self.bar, 0, 0, 1, 1)

    def run(self):
        self.bar.pushMessage("Hello", "World", level=QgsMessageBar.INFO)
../../_images/dialog-with-bar.png

Barra dei messaggi di QGIS in una finestra di dialogo personalizzata

Mostrare l’avanzamento

Le barre di avanzamento si possono mettere anche nella barra dei messaggi di QGIS, dato che, come abbiamo visto, accetta i widget. Di seguito un esempio che potrete provare nella console.

import time
from PyQt4.QtGui import QProgressBar
from PyQt4.QtCore import *
progressMessageBar = iface.messageBar().createMessage("Doing something boring...")
progress = QProgressBar()
progress.setMaximum(10)
progress.setAlignment(Qt.AlignLeft|Qt.AlignVCenter)
progressMessageBar.layout().addWidget(progress)
iface.messageBar().pushWidget(progressMessageBar, iface.messageBar().INFO)
for i in range(10):
    time.sleep(1)
    progress.setValue(i + 1)
iface.messageBar().clearWidgets()

Inoltre é possibile utilizzare la barra di stato integrata per mostrare un progresso, come nel prossimo esempio

count = layers.featureCount()
for i, feature in enumerate(features):
    #do something time-consuming here
    ...
    percent = i / float(count) * 100
    iface.mainWindow().statusBar().showMessage("Processed {} %".format(int(percent)))
iface.mainWindow().statusBar().clearMessage()

Logging

É possibile utilizzare il sistema di logging di QGIS per annotare tutte le informazioni che riguardano l’esecuzione del codice che si vogliono salvare.

# You can optionally pass a 'tag' and a 'level' parameters
QgsMessageLog.logMessage("Your plugin code has been executed correctly", 'MyPlugin', QgsMessageLog.INFO)
QgsMessageLog.logMessage("Your plugin code might have some problems", level=QgsMessageLog.WARNING)
QgsMessageLog.logMessage("Your plugin code has crashed!", level=QgsMessageLog.CRITICAL)