Čeština / English
Login

Návody / Pluginy pro QDevKit

Autor: Marek Vavruša ()

Abstrakt: Úvod do systému pluginů, přehled prostředí a dostupného API, příklad jednoduchého modulu v prostředí Python a C++.

Update: 26.9.2009

Zásuvné moduly (pluginy) umožňují rozšiřovat funkčnost aplikace QDevKit a představují též nejsnazší způsob komunikace s FITkitem. Moduly je možno psát v jazyce C++ či Python a libovolně je kombinovat, přičemž platí, že C++ moduly mají širší API.

1. Adresářová struktura

Každý plugin je oddělen od svého prostředí jednoduchou adresářovou strukturou skládájících se z minimálně tří souborů.

  • CMakeLists.txt - pravidla pro překlad

  • plugin.xml - popis (metadata)

  • plugin.{py/cpp} - zdrojový kód

  • plugin.png - ikona pluginu

Pravidla pro překlad (uvedená v souboru CMakeLists.txt) jsou víceméně shodná pro všechny, upravujeme je, pokud je třeba přibalit další soubory nebo volat další příkazy při překladu.

download.png Ukázka překladových pravidel pro plugin PyQuotes

Metadata v souboru plugin.xml jsou nezbytná pro správnou funkci modulu. Nejdůležitější funkcí je definice typu modulu - binary / script a název souboru sdílené knihovny či skriptu. Soubor zapisujeme v jazyce XML 1.0.

Příklad souboru project.xml:

<?xml version="1.0" encoding="utf-8"?>
<plugin type='script'>
   <name>My first plugin</name>
   <icon>plugin.png</icon>
   <comment>This is my first dummy plugin.</comment>
   <author>Marek Vavrusa</author>
   <email>marek AT vavrusa.com</email>
   <version>1.0</version>
   <license>GNU/GPL v2</license>
   <library>hello</library>
</plugin>
notify.png

2. Ukázka jednoduchého modulu

Jako ukázka nám poslouží jednoduchý plugin, který zobrazí hlášku na ikoně systémové lišty. Pro zobrazení zprávy je nutné mít v nastavení programu povolené zobrazení ikony a zpráv v systémové liště.

  • Verze v jazyce Python

    Zdrojový kód: hello.py

    from PythonQt import *
     
    ''' Plugin initialization '''
    def init():
       return True
     
    ''' Plugin load event '''
    def load():
       tray.showMessage('Hello plugin', 'Hello world!')
       return True
     
    ''' Plugin unload event '''
    def unload():
       tray.showMessage('Hello plugin', 'Plugin unloaded.')
       return True
  • Verze v jazyce C++

Při kompilaci projektu musí být adresář umístěn do adresářové struktury qdevkit-plugins ze SVN repozitáře z důvodu nastavení cest k dynamickým knihovnám a hlavičkovým souborům (Pokud neupravíte CMakeLists.txt).

Zdrojový kód: hello.h

#pragma once
#ifndef HELLO_H
#define HELLO_H
 
#include <QObject>
#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:
    bool mLoaded;    // Is loaded?
};
 
#endif

Zdrojový kód: hello.cpp

#include "hello.h"
#include <qdevkit/trayicon.h>
 
Hello::Hello()
: mLoaded(false)
{}
 
bool Hello::isLoaded()
{
   return mLoaded;
}
 
int Hello::load()
{
   tray().showMessage("Hello plugin", "Hello world!");
   mLoaded = true;
   return mLoaded;
}
 
int Hello::unload()
{
   tray().showMessage("Hello plugin", "Plugin unloaded.");
   mLoaded = false;
   return !mLoaded;
}
 
int Hello::configure()
{
   return true;
}
 
Q_EXPORT_PLUGIN2(pnp_Hello, Hello)

3. Interaktivní interpret skriptu

Prostředí QDevKit obsahuje interaktivní interpret skritu v jazyce Python (modul pythonqtconsole). Stejně jako v modulech je možno využívat dostupné API, a tak je velmi užitečný k testování uživatelských skriptů za běhu programu.

V tomto prostředí není možno využívat implicitních funkcí init(), load(), unload() tak, jako v pluginech.

4. Závěr

Seznámili jsme se s adresářovou strukturou modulu a vytvořili kostru jednoduchého pluginu. V další části plugin obohatíme o grafické rozhraní a propojíme s FITkitem.

Zobrazeno: 1399x Naposledy: 23.9.2017 12:51:57