Abstrakt: Práce s grafickým rozhraním a dostupným API v pluginech a skriptovací konzoli, ukázka implementace v C++ i Python.
U mnoho modulů je potřeba zasahovat do současného rozhraní či vytvářet nové prvky. Dobrým příkladem je skriptovací konzole, která přidává vlastní widget do dokovací oblasti. Implementaci provedeme do souborů z předchozí části (Pluginy pro QDevKit).
Jak v C++ tak v jazyce Python se s grafickým rozhraním pracuje prostřednictvím knihovny Qt. Pokud s ní nejste seznámeni, není na škodu prostudovat základy práce a referenční příručku k jednotlivým třídám.
Práce s hlavním oknem - QMainWindow
mainWindow() - hlavní okno, zpřístupňuje dokovací oblast (MainWindow)
tray() - ikona systémové lišty (TrayIcon)
Podrobné informace o API a metodách použitých objektů naleznete na Pluginy pro QDevKit: Přehled API .
V jazyce C++ lze prakticky neomezeně pracovat s knihovnou Qt a výsledek je možno zobrazit v libovolné oblasti. Pomocí třídy Component je možno přistupovat ke klíčovým částem programu. Pro informace o zpřístupněných metodách a vlastnostech nahlédněte do hlavičkových souborů tříd.
Zdrojový kód: hello.h
#pragma once #ifndef HELLO_H #define HELLO_H #include <QDockWidget> #include <qdevkit/plugininterfaces.h> class Hello : public QObject, public PluginInterface { Q_OBJECT Q_INTERFACES(PluginInterface) public: Hello(); bool isLoaded(); // Check if plugin loaded int load(); // Load plugin int unload(); // Unload plugin int configure(); // Configure - non-compulsory, responds to configure request private: QDockWidget* mWidget; // NEW: dock widget object }; #endif
Zdrojový kód: hello.cpp
#include "hello.h" #include <QLabel> #include <qdevkit/mainwindow.h> #include <qdevkit/trayicon.h> Hello::Hello() : mWidget(0) {} bool Hello::isLoaded() { return mWidget != 0; } int Hello::load() { tray().showMessage("Hello plugin", "Hello world!"); // Create widget mWidget = new QDockWidget(tr("Hello World!")); mWidget->setObjectName("HelloWorldWidget"); // For state saving QLabel* lbWidget = new QLabel(mWidget); lbWidget->setText(tr("This is my first widget!")); lbWidget->setAlignment(Qt::AlignCenter); mWidget->setWidget(lbWidget); // Display widget mainWindow().addToDock(Qt::BottomDockWidgetArea, mWidget); } int Hello::unload() { // Remove widget mainWindow().removeFromDock(mWidget); mWidget->deleteLater(); mWidget = 0; return !isLoaded(); } int Hello::configure() { return true; } Q_EXPORT_PLUGIN2(pnp_Hello, Hello)
Ve skriptovacím prostředí jsou komponenty dostupné jako globální proměnné, viz. tray a mainWindow. Přehled komponent naleznete na Pluginy pro QDevKit: Přehled API .
Zdrojový kód: hello.py
from PythonQt import * # Globalni objekt mWidget = QDockWidget() # Inicializace modulu # @return True|False def init(): mLabel = QLabel() mLabel.text = "This is my first widget!" mLabel.alignment = Qt.AlignCenter mWidget.windowTitle = "Hello world!" mWidget.setWidget(mLabel) mWidget.hide() mainWindow.addToDock(Qt.BottomDockWidgetArea, mWidget) return True # Spusteni modulu # @return True|False def load(): mWidget.show() return True # Ukonceni cinnosti # @return True|False def unload(): mWidget.hide() return True
Pouze metody označené Q_INVOKABLE, public slot a vlastnosti označené Q_PROPERTY jsou přístupné ve skriptovacím rozhraní.
Práce s grafickým rozhraním je velmi podobná jak u skriptovacího, tak C++ rozhraní. Pro jednoduché věci a prototypování je zpravidla lepší použít skript, jelikož jde testovat za běhu programu v konzoli.
Předchozí díl: Pluginy pro QDevKit
Následující díl: Pluginy pro QDevKit: Komunikace s FITkitem
Zpět na návody