建立 QCAD 外掛程式
QCAD 外掛程式可用於以 C 或 C++ 實作的功能來擴充 QCAD。
實作 RPluginInterface
Section titled “實作 RPluginInterface”所有 QCAD 外掛程式都必須直接或間接衍生自 QObject 和抽象基底類別 RPluginInterface。
檔案 RExamplePlugin.h
Section titled “檔案 RExamplePlugin.h”對於我們第一個極簡的範例外掛程式,我們將 RPluginInterface 大多數方法的空實作或極簡實作直接新增至標頭檔中。可以複製標頭檔的此初始結構,以取得可載入 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; }};檔案 RExamplePlugin.cpp
Section titled “檔案 RExamplePlugin.cpp”對於 getPluginInfo 方法,我們向 cpp 檔案新增一個簡單的實作,以便在 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#endif檔案 exampleplugin.pro
Section titled “檔案 exampleplugin.pro”若要編譯我們的外掛程式,我們還需要一個 Qt 專案檔,可以使用 Qt qmake 將其轉換為 Makefile。
CONFIG += pluginTARGET = exampleinclude(../../../shared.pri)
TEMPLATE = libHEADERS = RExamplePlugin.hSOURCES = RExamplePlugin.cppDESTDIR = ../../../pluginsLIBS += -lqcadcore -lqcadgui -lqcadecmaapi第 3 行的 include 應指向 QCAD 原始碼安裝的 shared.pri 檔案(例如 qcad/shared.pri)。作為 DESTDIR,您可能想選擇可用 QCAD 安裝的 plugins 資料夾,以便外掛程式編譯在正確的位置,QCAD 也可從該位置載入它。
可以使用這三個檔案編譯您的外掛程式,建立檔案 qcad/plugins/qcadexample.dll 或 libqcadexample.so 或 libqcadexample.dylib。
注意:如果您執行以偵錯模式編譯的 QCAD 二進位檔,則外掛程式也必須以偵錯模式編譯。如果您以發行模式執行 QCAD,則外掛程式也必須以發行模式編譯。
若要以偵錯模式編譯外掛程式,請執行:
Linux / macOS:
qmakemake debugWindows:
qmakenmake debug若要以發行模式編譯,請改為執行 make release 或 nmake release。
顯然,該外掛程式尚不會執行任何有用的操作,但您應該能夠在 QCAD 關於對話方塊中看到您的外掛程式:
如果看不到您的外掛程式,請在啟動 QCAD 時檢查終端機中的錯誤。您也可能在關於對話方塊中看到錯誤訊息。
將指令碼作為資源編譯到外掛程式中
Section titled “將指令碼作為資源編譯到外掛程式中”QCAD 外掛程式可用於將指令碼和其他資源(ui 檔案、圖示等)的集合編譯到外掛程式中。這樣做的優點是可以將多個 ECMAScript 檔案的程式碼捆綁在單一已編譯的二進位檔中。外掛程式的載入往往比磁碟上的個別檔案更快,並且佔用的磁碟空間更少。
檔案 scripts/MyTool/MyTool.js
Section titled “檔案 scripts/MyTool/MyTool.js”假設有一個資料夾 scripts/MyTool,其中有一個檔案 MyTool.js,包含一個以 ECMAScript 實作的 QCAD 工具。該工具將自身新增至雜項功能表的頂端,並在觸發時輸出 “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"]);};檔案 scripts.qrc
Section titled “檔案 scripts.qrc”若要將此指令碼工具編譯到我們的 C++ 外掛程式中,我們需要建立一個 Qt 資源檔,將 qmake 指向我們要編譯到外掛程式中的檔案:
<!DOCTYPE RCC><RCC version="1.0"> <qresource> <file alias="scripts/MyTool/MyTool.js">scripts/MyTool/MyTool.js</file> </qresource></RCC>qrc 檔案列出資源在 Qt 資源系統中將提供的路徑(alias=“scripts/MyTool/MyTool.js”)以及可在磁碟上找到該檔案的實際路徑(僅用於編譯)。上述範例表示磁碟上 scripts/MyTool/MyTool.js 下有一個檔案,將被編譯到外掛程式中。外掛程式一載入,該檔案就可在路徑 “:/scripts/MyTool/MyTool.js” 下使用。QCAD 會自動在該路徑下找到該工具,因為它會掃描 “scripts” 資料夾以及 “:/scripts” 來尋找指令碼。
我們還需要透過新增以下行將 qrc 檔案新增至專案檔(exampleplugin.pro)中:
RESOURCES = scripts.qrc編輯檔案 exampleplugin.pro 後,再次執行 qmake 和 make 並載入外掛程式。現在,QCAD 中雜項功能表的頂端應該有一個 “MyTool” 功能表項目。
您可以在以下位置找到此範例外掛程式的完整原始碼:
https://github.com/qcad/qcad/tree/master/support/examples/exampleplugin
- 如果您的外掛程式可以編譯但無法被 QCAD 載入,請確保使用與 QCAD 相同的 Qt 版本(請參閱 說明 > 關於 QCAD)。請確保如果 QCAD 以發行模式執行,您的外掛程式也以發行模式編譯。
- 從終端機或命令列啟動 QCAD,並檢查主控台輸出中的錯誤訊息。在您的外掛程式中輸出訊息以確認它正在載入。例如在您的 init 函式中。
- 檢查關於對話方塊(說明 > 關於 QCAD > 外掛程式)中的錯誤訊息。