Skip to content

Crearea unui plugin QCAD

Plugin-urile QCAD pot fi utilizate pentru a extinde QCAD cu funcționalitate implementată în C sau C++.

Toate plugin-urile QCAD trebuie să fie derivate direct sau indirect din QObject și din clasa de bază abstractă RPluginInterface.

Pentru primul nostru plugin exemplu, minimalist, adăugăm implementări goale sau minimaliste pentru majoritatea metodelor RPluginInterface direct în fișierul antet. Această structură inițială a fișierului antet poate fi copiată pentru a obține un prim plugin funcțional care poate fi încărcat în 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; }
};

Pentru metoda getPluginInfo, adăugăm o implementare simplă la fișierul cpp pentru a vedea ceva în dialogul „Despre” al 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 < 0x050000
QT_BEGIN_NAMESPACE
Q_EXPORT_PLUGIN2(example, RExamplePlugin)
QT_END_NAMESPACE
#endif

Pentru a compila plugin-ul nostru, avem nevoie și de un fișier de proiect Qt care poate fi transformat într-un Makefile cu Qt qmake.

CONFIG += plugin
TARGET = example
include(../../../shared.pri)
TEMPLATE = lib
HEADERS = RExamplePlugin.h
SOURCES = RExamplePlugin.cpp
DESTDIR = ../../../plugins
LIBS += -lqcadcore -lqcadgui -lqcadecmaapi

Includerea de pe linia 3 ar trebui să indice fișierul shared.pri al instalării codului sursă QCAD (de ex. qcad/shared.pri). Ca DESTDIR, ați putea dori să alegeți folderul plugins al unei instalări QCAD funcționale, astfel încât plugin-ul să fie compilat în locul potrivit, de unde poate fi și încărcat de QCAD.

Plugin-ul dvs. poate fi compilat cu aceste trei fișiere, creând fișierul qcad/plugins/qcadexample.dll sau libqcadexample.so sau libqcadexample.dylib.

Notă: dacă rulați un binar QCAD compilat în mod de depanare (debug), plugin-ul trebuie de asemenea compilat în mod de depanare. Dacă rulați QCAD în mod release, plugin-ul trebuie compilat de asemenea în mod release.

Pentru a compila plugin-ul în mod de depanare, rulați:

Linux / macOS:

qmake
make debug

Windows:

qmake
nmake debug

Pentru a compila în mod release, rulați în schimb make release sau nmake release.

Evident, plugin-ul nu va face încă nimic util, dar ar trebui să puteți vedea plugin-ul dvs. în dialogul „Despre” al QCAD:

Plugin-ul exemplu listat în dialogul 'Despre' al QCAD

Dacă nu puteți vedea plugin-ul dvs., verificați erorile din terminal în timp ce porniți QCAD. Este posibil să vedeți de asemenea un mesaj de eroare în dialogul „Despre”.

Compilarea scripturilor ca resurse într-un plugin

Section titled “Compilarea scripturilor ca resurse într-un plugin”

Plugin-urile QCAD pot fi utilizate pentru a compila o colecție de scripturi și alte resurse (fișiere ui, pictograme etc.) într-un plugin. Acest lucru are avantajul că codul mai multor fișiere ECMAScript poate fi grupat într-un singur fișier binar compilat. Plugin-urile tind să se încarce mai rapid decât fișierele individuale de pe disc și ocupă mai puțin spațiu pe disc.

Să presupunem că există un folder scripts/MyTool cu un fișier MyTool.js care conține un instrument QCAD, implementat în ECMAScript. Instrumentul se adaugă în partea de sus a meniului Diverse și afișează „Hello World” când este declanșat.

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"]);
};

Pentru a compila acest instrument de script în plugin-ul nostru C++, trebuie să creăm un fișier de resurse Qt care indică qmake fișierul pe care dorim să îl compilăm în plugin:

<!DOCTYPE RCC>
<RCC version="1.0">
<qresource>
<file alias="scripts/MyTool/MyTool.js">scripts/MyTool/MyTool.js</file>
</qresource>
</RCC>

Fișierul qrc listează căile sub care resursele trebuie făcute disponibile în sistemul de resurse Qt (alias=“scripts/MyTool/MyTool.js”) și calea reală unde poate fi găsit fișierul pe disc (utilizată doar pentru compilare). Exemplul de mai sus înseamnă că există un fișier pe disc sub scripts/MyTool/MyTool.js care va fi compilat în plugin. Imediat ce plugin-ul este încărcat, fișierul va fi disponibil sub calea “:/scripts/MyTool/MyTool.js”. QCAD va găsi instrumentul automat sub acea cale, deoarece scanează folderul „scripts” precum și “:/scripts” pentru scripturi.

Trebuie de asemenea să adăugăm fișierul qrc la fișierul de proiect (exampleplugin.pro) adăugând următoarea linie:

RESOURCES = scripts.qrc

După editarea fișierului exampleplugin.pro, rulați din nou qmake și make și încărcați plugin-ul. Ar trebui să existe acum o intrare de meniu „MyTool” în partea de sus a meniului Diverse din QCAD.

Puteți găsi codul sursă complet pentru acest plugin exemplu la:

https://github.com/qcad/qcad/tree/master/support/examples/exampleplugin

  • Dacă plugin-ul dvs. se compilează, dar nu poate fi încărcat de QCAD, asigurați-vă că se utilizează aceeași versiune Qt ca pentru QCAD (vedeți Ajutor > Despre QCAD). Asigurați-vă că, dacă QCAD este rulat în mod release, plugin-ul dvs. este de asemenea compilat în mod release.
  • Lansați QCAD dintr-un terminal sau din linia de comandă și verificați ieșirea consolei pentru mesaje de eroare. Afișați mesaje în plugin-ul dvs. pentru a confirma că este încărcat. De exemplu în funcția init.
  • Verificați dialogul „Despre” (Ajutor > Despre QCAD > Plugin-uri) pentru mesaje de eroare.