Čeština / English
Login

Návody / Pluginy pro QDevKit: Tvorba grafického rozhraní

Autor: Marek Vavruša ()

Abstrakt: Práce s grafickým rozhraním a dostupným API v pluginech a skriptovací konzoli, ukázka implementace v C++ i Python.

Update: 27.9.2009

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.

1. Použité komponenty prostředí QDevKit

  • 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 .

2. Příklad: Tvorba grafického rozhraní v C++

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.

hello2b.png

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)

3. Příklad: Tvorba grafického rozhraní v Pythonu

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í.

4. Závěr

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.

Zobrazeno: 1425x Naposledy: 17.11.2017 05:03:49