Взаємодія з користувачем

У цьому розділі розглядаються деякі методи та елементи, які повинні використовуватися для взаємодії з користувачем, щоб дотримуватися однорідності в інтерфейсі.

Повідомлення. Клас QgsMessageBar

З точки зору користувача використання діалогових вікон для повідомлень погана ідея. Для відображення коротких інформаційних повідомлень або попереджень чи повідомлень про помилки краще використовувати панель повідомлень QGIS.

Показати повідомлення в панелі повідомлень QGIS можна за допомогою наступного коду

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

Панель повідомлень QGIS

Можна вказати тривалість відображення

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

Панель повідомлень QGIS з таймером

Попередні приклади стосувалися повідомлень про помилки, але змінюючи параметр level можна створити попередження (QgsMessageBar.WARNING) або інформаційне повідомлення (QgsMessageBar.INFO).

../../_images/infobar.png

Панель повідомлень QGIS (інформація)

На панелі повідомлень також можна розмістити додаткові віджети, наприклад, кнопку, яка покаже подробиці

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

Панель повідомлень QGIS з кнопкою

Панель повідомлень 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

Панель повідомлень QGIS у діалозі

Індикація прогресу

Індикатор прогресу також можна розмістити у панелі повідомлень QGIS, як ми вже бачили, вона дозволяє розміщення віджетів. Ниже наведено приклад, який можна виконати в консолі Python

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

Крім того, ви можете використовувати індикатор прогресу у панелі статусу, як це показано в наступному фрагменті коду

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

Реєстрація помилок

Будь-яку інформацію про виконання коду можна також реєструвати за допомогою системи реєстрації помилок QGIS, як показано нижче

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