Vytvoření zásuvného modulu QCAD
Úvod
Sekce “Úvod”Zásuvné moduly QCAD lze použít k rozšíření QCAD o funkce implementované v C nebo C++.
Implementace RPluginInterface
Sekce “Implementace RPluginInterface”Všechny zásuvné moduly QCAD musí být přímo nebo nepřímo odvozeny od QObject a abstraktní základní třídy RPluginInterface.
Soubor RExamplePlugin.h
Sekce “Soubor RExamplePlugin.h”Pro náš první, minimalistický ukázkový zásuvný modul přidáme prázdné nebo minimalistické implementace pro většinu metod RPluginInterface přímo do hlavičkového souboru. Tuto počáteční strukturu hlavičkového souboru lze zkopírovat, abyste získali první funkční zásuvný modul, který lze načíst do QCAD.
#include <QObject>#include <QScriptEngine>
#include "RPluginInterface.h"
class RExamplePlugin : public QObject, public RPluginInterface{ Q_OBJECT Q_INTERFACES(RPluginInterface)#if QT_VERSION >= 0x050000 Q_PLUGIN_METADATA(IID "org.qcad.exampleplugin")#endif
public: virtual bool init() { return true; } virtual void uninit(bool) {} virtual void postInit(InitStatus status) {} virtual void initScriptExtensions(QScriptEngine& engine) {} virtual RPluginInfo getPluginInfo(); virtual bool checkLicense() { return true; }};Soubor RExamplePlugin.cpp
Sekce “Soubor RExamplePlugin.cpp”Pro metodu getPluginInfo přidáme do souboru cpp jednoduchou implementaci, abychom viděli něco v dialogu „O aplikaci” v QCAD.
#include "RExamplePlugin.h"
RPluginInfo RExamplePlugin::getPluginInfo() { RPluginInfo ret; ret.set("Version", "1.0"); ret.set("ID", "EXAMPLE"); ret.set("Name", "Example Plugin"); ret.set("License", "GPLv3"); ret.set("URL", "http://qcad.org"); return ret;}
#if QT_VERSION < 0x050000QT_BEGIN_NAMESPACEQ_EXPORT_PLUGIN2(example, RExamplePlugin)QT_END_NAMESPACE#endifSoubor exampleplugin.pro
Sekce “Soubor exampleplugin.pro”Abychom zkompilovali náš zásuvný modul, potřebujeme také soubor projektu Qt, který lze pomocí Qt qmake převést na Makefile.
CONFIG += pluginTARGET = exampleinclude(../../../shared.pri)
TEMPLATE = libHEADERS = RExamplePlugin.hSOURCES = RExamplePlugin.cppDESTDIR = ../../../pluginsLIBS += -lqcadcore -lqcadgui -lqcadecmaapiVložení na řádku 3 by mělo směřovat na soubor shared.pri instalace zdrojového kódu QCAD (např. qcad/shared.pri). Jako DESTDIR můžete chtít zvolit složku plugins funkční instalace QCAD, aby se zásuvný modul zkompiloval na správném místě, odkud jej může QCAD také načíst.
Kompilace
Sekce “Kompilace”Váš zásuvný modul lze zkompilovat pomocí těchto tří souborů, čímž se vytvoří soubor qcad/plugins/qcadexample.dll nebo libqcadexample.so nebo libqcadexample.dylib.
Poznámka: pokud spouštíte binární soubor QCAD zkompilovaný v ladicím režimu (debug), musí být i zásuvný modul zkompilován v ladicím režimu. Pokud spouštíte QCAD v režimu release, musí být i zásuvný modul zkompilován v režimu release.
Chcete-li zkompilovat zásuvný modul v ladicím režimu, spusťte:
Linux / macOS:
qmakemake debugWindows:
qmakenmake debugChcete-li kompilovat v režimu release, spusťte místo toho make release nebo nmake release.
Zásuvný modul zatím samozřejmě nebude dělat nic užitečného, ale měli byste být schopni vidět svůj zásuvný modul v dialogu „O aplikaci” v QCAD:
Pokud svůj zásuvný modul nevidíte, zkontrolujte prosím chyby v terminálu při spouštění QCAD. Chybové hlášení můžete vidět také v dialogu „O aplikaci”.
Kompilace skriptů jako prostředků do zásuvného modulu
Sekce “Kompilace skriptů jako prostředků do zásuvného modulu”Zásuvné moduly QCAD lze použít ke kompilaci kolekce skriptů a dalších prostředků (soubory ui, ikony atd.) do zásuvného modulu. To má tu výhodu, že kód více souborů ECMAScript lze seskupit do jediného zkompilovaného binárního souboru. Zásuvné moduly se obvykle načítají rychleji než jednotlivé soubory z disku a zabírají méně místa na disku.
Soubor scripts/MyTool/MyTool.js
Sekce “Soubor scripts/MyTool/MyTool.js”Předpokládejme, že existuje složka scripts/MyTool se souborem MyTool.js, který obsahuje nástroj QCAD implementovaný v ECMAScriptu. Nástroj se přidá do horní části nabídky Různé a při spuštění vypíše „Hello World”.
include("scripts/EAction.js");
function MyTool(guiAction) { EAction.call(this, guiAction);}
MyTool.prototype = new EAction();
MyTool.prototype.beginEvent = function() { EAction.prototype.beginEvent.call(this);
EAction.handleUserMessage("Hello World");
this.terminate();};
MyTool.init = function(basePath) { var action = new RGuiAction("&MyTool", RMainWindowQt.getMainWindow()); action.setRequiresDocument(true); action.setScriptFile(basePath + "/MyTool.js"); action.setGroupSortOrder(0); action.setSortOrder(0); action.setWidgetNames(["MiscMenu"]);};Soubor scripts.qrc
Sekce “Soubor scripts.qrc”Abychom tento skriptový nástroj zkompilovali do našeho zásuvného modulu C++, musíme vytvořit soubor prostředků Qt, který nasměruje qmake na soubor, který chceme zkompilovat do zásuvného modulu:
<!DOCTYPE RCC><RCC version="1.0"> <qresource> <file alias="scripts/MyTool/MyTool.js">scripts/MyTool/MyTool.js</file> </qresource></RCC>Soubor qrc uvádí cesty, pod kterými mají být prostředky zpřístupněny v systému prostředků Qt (alias=“scripts/MyTool/MyTool.js”), a skutečnou cestu, kde lze soubor najít na disku (používá se pouze pro kompilaci). Výše uvedený příklad znamená, že na disku existuje soubor pod scripts/MyTool/MyTool.js, který bude zkompilován do zásuvného modulu. Jakmile je zásuvný modul načten, soubor bude dostupný pod cestou “:/scripts/MyTool/MyTool.js”. QCAD najde nástroj automaticky pod touto cestou, protože prohledává složku „scripts” i “:/scripts” pro skripty.
Musíme také přidat soubor qrc do souboru projektu (exampleplugin.pro) přidáním následujícího řádku:
RESOURCES = scripts.qrcPo úpravě souboru exampleplugin.pro znovu spusťte qmake a make a načtěte zásuvný modul. Nyní by měla být položka nabídky „MyTool” v horní části nabídky Různé v QCAD.
Zdrojový kód
Sekce “Zdrojový kód”Kompletní zdrojový kód pro tento ukázkový zásuvný modul najdete na:
https://github.com/qcad/qcad/tree/master/support/examples/exampleplugin
Řešení potíží
Sekce “Řešení potíží”- Pokud se váš zásuvný modul zkompiluje, ale QCAD jej nemůže načíst, ujistěte se prosím, že se používá stejná verze Qt jako pro QCAD (viz Nápověda > O aplikaci QCAD). Ujistěte se prosím, že pokud je QCAD spuštěn v režimu release, je i váš zásuvný modul zkompilován v režimu release.
- Spusťte QCAD z terminálu nebo příkazového řádku a zkontrolujte výstup konzole na chybová hlášení. Vypisujte zprávy ve svém zásuvném modulu, abyste potvrdili, že se načítá. Například ve své funkci init.
- Zkontrolujte chybová hlášení v dialogu „O aplikaci” (Nápověda > O aplikaci QCAD > Zásuvné moduly).