Comunicarea cu utilizatorul

Această secțiune prezintă câteva metode și elemente care ar trebui să fie utilizate pentru a comunica cu utilizatorul, în scopul menținerii coerenței interfaței cu utilizatorul.

Showing messages. The QgsMessageBar class.

Using mesages boxes can be a bad idea from a user experience point of view. For showing a small info line or a warning/error messages, the QGIS message bar is usually a better option

Using the reference to the QGIS interface object, you can show a message in the message bar with the following code.

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

Bara de mesaje a QGIS

You can set a duration to show it for a limited time.

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

Bara de mesaje a QGIS, cu cronometru

The examples above show an error bar, but the level parameter can be used to creating warning messages or info messages, using the QgsMessageBar.WARNING and QgsMessageBar.INFO constants repectively.

static/pyqgis_developer_cookbook/warningbar.png

QGIS Message bar (warning)

../../_images/infobar.png

Bara de mesaje a QGIS (info)

Widget-urile pot fi adăugate la bara de mesaje, cum ar fi, de exemplu, un buton pentru afișarea mai multor informații

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)
static/pyqgis_developer_cookbook/button-bar.png

Bara de mesaje a QGIS, cu un buton

You can even use a message bar in your own dialog so you don’t have to show a message box, or if it doesn’t make sense to show it in the main QGIS window.

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

Bara de mesaje a QGIS, într-o fereastră de dialog

Afișarea progresului

Barele de progres pot fi, de asemenea, incluse în bara de mesaje QGIS, din moment ce, așa cum am văzut, aceasta acceptă widget-uri. Iată un exemplu pe care îl puteți încerca în consolă.

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()

Also, you can use the built-in status bar to report progress, as in the next example.

::

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()

Jurnalizare

Puteți utiliza sistemul de jurnalizare al QGIS, pentru a salva toate informațiile pe care doriți să le înregistrați, cu privire la execuția codului dvs.

QgsMessageLog.logMessage("Your plugin code has been executed correctly", \
  QgsMessageLog.INFO)
QgsMessageLog.logMessage("Your plugin code might have some problems", \
  QgsMessageLog.WARNING)
QgsMessageLog.logMessage("Your plugin code has crashed!", \
  QgsMessageLog.CRITICAL)