Skip to content

建立 QCAD 外掛程式

QCAD 外掛程式可用於以 C 或 C++ 實作的功能來擴充 QCAD。

所有 QCAD 外掛程式都必須直接或間接衍生自 QObject 和抽象基底類別 RPluginInterface。

對於我們第一個極簡的範例外掛程式,我們將 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; }
};

對於 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 < 0x050000
QT_BEGIN_NAMESPACE
Q_EXPORT_PLUGIN2(example, RExamplePlugin)
QT_END_NAMESPACE
#endif

若要編譯我們的外掛程式,我們還需要一個 Qt 專案檔,可以使用 Qt qmake 將其轉換為 Makefile。

CONFIG += plugin
TARGET = example
include(../../../shared.pri)
TEMPLATE = lib
HEADERS = RExamplePlugin.h
SOURCES = RExamplePlugin.cpp
DESTDIR = ../../../plugins
LIBS += -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:

qmake
make debug

Windows:

qmake
nmake debug

若要以發行模式編譯,請改為執行 make release 或 nmake release。

顯然,該外掛程式尚不會執行任何有用的操作,但您應該能夠在 QCAD 關於對話方塊中看到您的外掛程式:

QCAD 關於對話方塊中列出的範例外掛程式

如果看不到您的外掛程式,請在啟動 QCAD 時檢查終端機中的錯誤。您也可能在關於對話方塊中看到錯誤訊息。

將指令碼作為資源編譯到外掛程式中

Section titled “將指令碼作為資源編譯到外掛程式中”

QCAD 外掛程式可用於將指令碼和其他資源(ui 檔案、圖示等)的集合編譯到外掛程式中。這樣做的優點是可以將多個 ECMAScript 檔案的程式碼捆綁在單一已編譯的二進位檔中。外掛程式的載入往往比磁碟上的個別檔案更快,並且佔用的磁碟空間更少。

假設有一個資料夾 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"]);
};

若要將此指令碼工具編譯到我們的 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 > 外掛程式)中的錯誤訊息。