Перейти к содержимому

Создание плагина QCAD

Плагины QCAD можно использовать для расширения QCAD функциональностью, реализованной на C или C++.

Все плагины 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, который можно превратить в Makefile с помощью Qt qmake.

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

Директива include в строке 3 должна указывать на файл shared.pri установки исходного кода QCAD (например, qcad/shared.pri). В качестве DESTDIR вы можете выбрать папку plugins рабочей установки QCAD, чтобы плагин компилировался в нужном месте, откуда он также может быть загружен 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. Вы также можете увидеть сообщение об ошибке в диалоге «О программе».

Компиляция скриптов в качестве ресурсов в плагин

Заголовок раздела «Компиляция скриптов в качестве ресурсов в плагин»

Плагины QCAD можно использовать для компиляции коллекции скриптов и других ресурсов (файлов ui, значков и т. д.) в плагин. Это имеет преимущество в том, что код нескольких файлов ECMAScript можно объединить в едином скомпилированном двоичном файле. Плагины обычно загружаются быстрее, чем отдельные файлы с диска, и занимают меньше дискового пространства.

Предположим, что есть папка scripts/MyTool с файлом MyTool.js, который содержит инструмент QCAD, реализованный на ECMAScript. Инструмент добавляет себя в верхнюю часть меню Разное и выводит «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, убедитесь, что используется та же версия Qt, что и для QCAD (см. Справка > О программе QCAD). Убедитесь, что если QCAD запускается в режиме выпуска, ваш плагин также скомпилирован в режиме выпуска.
  • Запустите QCAD из терминала или командной строки и проверьте вывод консоли на наличие сообщений об ошибках. Выводите сообщения в своём плагине, чтобы подтвердить, что он загружается. Например, в вашей функции init.
  • Проверьте диалог «О программе» (Справка > О программе QCAD > Плагины) на наличие сообщений об ошибках.