Создание плагина QCAD
Введение
Заголовок раздела «Введение»Плагины QCAD можно использовать для расширения QCAD функциональностью, реализованной на C или C++.
Реализация RPluginInterface
Заголовок раздела «Реализация RPluginInterface»Все плагины QCAD должны быть прямо или косвенно производными от QObject и абстрактного базового класса RPluginInterface.
Файл RExamplePlugin.h
Заголовок раздела «Файл 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
Заголовок раздела «Файл 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
Заголовок раздела «Файл exampleplugin.pro»Чтобы скомпилировать наш плагин, нам также нужен файл проекта Qt, который можно превратить в Makefile с помощью Qt qmake.
CONFIG += pluginTARGET = exampleinclude(../../../shared.pri)
TEMPLATE = libHEADERS = RExamplePlugin.hSOURCES = RExamplePlugin.cppDESTDIR = ../../../pluginsLIBS += -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:
qmakemake debugWindows:
qmakenmake debugЧтобы скомпилировать в режиме выпуска, выполните вместо этого make release или nmake release.
Разумеется, плагин пока не будет делать ничего полезного, но вы должны увидеть свой плагин в диалоге «О программе» QCAD:
Если вы не видите свой плагин, проверьте наличие ошибок в терминале при запуске QCAD. Вы также можете увидеть сообщение об ошибке в диалоге «О программе».
Компиляция скриптов в качестве ресурсов в плагин
Заголовок раздела «Компиляция скриптов в качестве ресурсов в плагин»Плагины QCAD можно использовать для компиляции коллекции скриптов и других ресурсов (файлов ui, значков и т. д.) в плагин. Это имеет преимущество в том, что код нескольких файлов ECMAScript можно объединить в едином скомпилированном двоичном файле. Плагины обычно загружаются быстрее, чем отдельные файлы с диска, и занимают меньше дискового пространства.
Файл scripts/MyTool/MyTool.js
Заголовок раздела «Файл scripts/MyTool/MyTool.js»Предположим, что есть папка 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"]);};Файл scripts.qrc
Заголовок раздела «Файл 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, убедитесь, что используется та же версия Qt, что и для QCAD (см. Справка > О программе QCAD). Убедитесь, что если QCAD запускается в режиме выпуска, ваш плагин также скомпилирован в режиме выпуска.
- Запустите QCAD из терминала или командной строки и проверьте вывод консоли на наличие сообщений об ошибках. Выводите сообщения в своём плагине, чтобы подтвердить, что он загружается. Например, в вашей функции init.
- Проверьте диалог «О программе» (Справка > О программе QCAD > Плагины) на наличие сообщений об ошибках.