Przejdź do głównej zawartości

Tworzenie wtyczki QCAD

Wtyczki QCAD mogą być używane do rozszerzania QCAD o funkcjonalność zaimplementowaną w C lub C++.

Wszystkie wtyczki QCAD muszą być bezpośrednio lub pośrednio wyprowadzone z QObject i abstrakcyjnej klasy bazowej RPluginInterface.

Dla naszej pierwszej, minimalistycznej przykładowej wtyczki dodajemy puste lub minimalistyczne implementacje dla większości metod RPluginInterface bezpośrednio do pliku nagłówkowego. Tę początkową strukturę pliku nagłówkowego można skopiować, aby uzyskać pierwszą działającą wtyczkę, którą można załadować 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; }
};

Dla metody getPluginInfo dodajemy prostą implementację do pliku cpp, aby zobaczyć coś w oknie dialogowym „O programie” 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

Aby skompilować naszą wtyczkę, potrzebujemy również pliku projektu Qt, który można zamienić na plik Makefile za pomocą Qt qmake.

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

Dołączenie w wierszu 3 powinno wskazywać na plik shared.pri instalacji kodu źródłowego QCAD (np. qcad/shared.pri). Jako DESTDIR możesz chcieć wybrać folder plugins działającej instalacji QCAD, aby wtyczka została skompilowana we właściwym miejscu, z którego może być również ładowana przez QCAD.

Twoją wtyczkę można skompilować za pomocą tych trzech plików, tworząc plik qcad/plugins/qcadexample.dll lub libqcadexample.so lub libqcadexample.dylib.

Uwaga: jeśli uruchamiasz plik binarny QCAD skompilowany w trybie debugowania, wtyczka również musi być skompilowana w trybie debugowania. Jeśli uruchamiasz QCAD w trybie release, wtyczka również musi być skompilowana w trybie release.

Aby skompilować wtyczkę w trybie debugowania, uruchom:

Linux / macOS:

qmake
make debug

Windows:

qmake
nmake debug

Aby skompilować w trybie release, uruchom zamiast tego make release lub nmake release.

Oczywiście wtyczka nie będzie jeszcze robić nic użytecznego, ale powinieneś móc zobaczyć swoją wtyczkę w oknie dialogowym „O programie” QCAD:

Przykładowa wtyczka wymieniona w oknie dialogowym 'O programie' QCAD

Jeśli nie widzisz swojej wtyczki, sprawdź błędy w terminalu podczas uruchamiania QCAD. Możesz również zobaczyć komunikat o błędzie w oknie dialogowym „O programie”.

Wtyczki QCAD mogą być używane do kompilowania kolekcji skryptów i innych zasobów (plików ui, ikon itp.) do wtyczki. Ma to tę zaletę, że kod wielu plików ECMAScript można spakować w jednym, skompilowanym pliku binarnym. Wtyczki zwykle ładują się szybciej niż pojedyncze pliki z dysku i zajmują mniej miejsca na dysku.

Załóżmy, że istnieje folder scripts/MyTool z plikiem MyTool.js, który zawiera narzędzie QCAD zaimplementowane w ECMAScript. Narzędzie dodaje się na górze menu Różne i wyświetla „Hello World” po uruchomieniu.

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

Aby skompilować to narzędzie skryptowe do naszej wtyczki C++, musimy utworzyć plik zasobów Qt, który wskazuje qmake plik, który chcemy skompilować do wtyczki:

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

Plik qrc wymienia ścieżki, pod którymi zasoby mają być udostępnione w systemie zasobów Qt (alias=“scripts/MyTool/MyTool.js”), oraz rzeczywistą ścieżkę, gdzie plik można znaleźć na dysku (używaną tylko do kompilacji). Powyższy przykład oznacza, że na dysku istnieje plik pod scripts/MyTool/MyTool.js, który zostanie skompilowany do wtyczki. Gdy tylko wtyczka zostanie załadowana, plik będzie dostępny pod ścieżką “:/scripts/MyTool/MyTool.js”. QCAD znajdzie narzędzie automatycznie pod tą ścieżką, ponieważ skanuje folder „scripts” oraz “:/scripts” w poszukiwaniu skryptów.

Musimy również dodać plik qrc do pliku projektu (exampleplugin.pro), dodając następujący wiersz:

RESOURCES = scripts.qrc

Po edycji pliku exampleplugin.pro uruchom ponownie qmake i make oraz załaduj wtyczkę. Teraz na górze menu Różne w QCAD powinien znajdować się wpis menu „MyTool”.

Kompletny kod źródłowy tej przykładowej wtyczki można znaleźć pod adresem:

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

  • Jeśli twoja wtyczka się kompiluje, ale nie może zostać załadowana przez QCAD, upewnij się, że używana jest ta sama wersja Qt co dla QCAD (zobacz Pomoc > O QCAD). Upewnij się, że jeśli QCAD jest uruchamiany w trybie release, twoja wtyczka również jest skompilowana w trybie release.
  • Uruchom QCAD z terminala lub wiersza poleceń i sprawdź dane wyjściowe konsoli pod kątem komunikatów o błędach. Wyświetlaj komunikaty w swojej wtyczce, aby potwierdzić, że jest ładowana. Na przykład w funkcji init.
  • Sprawdź okno dialogowe „O programie” (Pomoc > O QCAD > Wtyczki) pod kątem komunikatów o błędach.