Cette section montre quelques méthodes et éléments qui devraient être employés pour communiquer avec l’utilisateur dans l’objectif de conserver une certaine constance dans l’interface utilisateur
Utiliser des boîtes à message est généralement une mauvaise idée du point de vue de l’expérience utilisateur. Pour afficher une information simple sur une seule ligne ou des messages d’avertissement ou d’erreur, la barre de message QGIS est généralement une meilleure option.
En utilisant la référence vers l’objet d’interface QGis, vous pouvez afficher un message dans la barre de message à l’aide du code suivant
iface.messageBar().pushMessage("Error", "I'm sorry Dave, I'm afraid I can't do that", level=QgsMessageBar.CRITICAL)
Vous pouvez spécifier une durée pour que l’affichage soit limité dans le temps.
iface.messageBar().pushMessage("Error", ""Ooops, the plugin is not working as it should", level=QgsMessageBar.CRITICAL, duration=3)
Les exemples ci-dessus montrent une barre d’erreur. Le paramètre level peut être utilisé pour créer des messages d’avertissement ou d’information en utilisant respectivement les constantes QgsMessageBar.WARNING ou QgsMessageBar.INFO.
Des Widgets peuvent être ajoutés à la barre de message comme par exemple un bouton pour montrer davantage d’information
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)
Vous pouvez également utiliser une barre de message au sein de votre propre boîte de dialogue afin de ne pas afficher de boîte à message ou bien s’il n’y pas d’intérêt de l’afficher dans la fenêtre principale de 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)
Les barres de progression peuvent également être insérées dans la barre de message QGis car, comme nous l’avons déjà vu, cette dernière accepte les widgets. Voici un exemple que vous pouvez utilisez dans la 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()
Vous pouvez également utiliser la barre d’état incorporée pour afficher une progression, comme dans l’exemple suivant
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()
Vous pouvez utiliser le système de journal de QGis pour enregistrer toute information à conserver sur l’exécution de votre code.
# 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)