Създаване на приставка за QCAD
Въведение
Section titled “Въведение”Приставките за QCAD могат да се използват за разширяване на QCAD с функционалност, реализирана на C или C++.
Реализиране на 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, който може да бъде превърнат в Makefile с Qt qmake.
CONFIG += pluginTARGET = exampleinclude(../../../shared.pri)
TEMPLATE = libHEADERS = RExamplePlugin.hSOURCES = RExamplePlugin.cppDESTDIR = ../../../pluginsLIBS += -lqcadcore -lqcadgui -lqcadecmaapiВключването на ред 3 трябва да сочи към файла shared.pri от инсталацията на изходния код на QCAD (напр. qcad/shared.pri). Като DESTDIR може да искате да изберете папката с приставки на работеща инсталация на QCAD, така че приставката да се компилира на правилното място, откъдето може да бъде и заредена от QCAD.
Компилиране
Section titled “Компилиране”Вашата приставка може да бъде компилирана с тези три файла, като се създава файлът qcad/plugins/qcadexample.dll или libqcadexample.so, или libqcadexample.dylib.
Забележка: ако изпълнявате двоичен файл на QCAD, компилиран в режим за отстраняване на грешки (debug), приставката също трябва да бъде компилирана в режим за отстраняване на грешки. Ако изпълнявате QCAD в режим release, приставката също трябва да бъде компилирана в режим release.
За да компилирате приставката в режим за отстраняване на грешки, изпълнете:
Linux / macOS:
qmakemake debugWindows:
qmakenmake debugЗа да компилирате в режим release, вместо това изпълнете 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, който съдържа инструмент на 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
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 отново и заредете приставката. Сега трябва да има елемент от менюто „MyTool” в горната част на менюто Разни в QCAD.
Изходен код
Section titled “Изходен код”Можете да намерите пълния изходен код за тази примерна приставка на:
https://github.com/qcad/qcad/tree/master/support/examples/exampleplugin
Отстраняване на неизправности
Section titled “Отстраняване на неизправности”- Ако вашата приставка се компилира, но не може да бъде заредена от QCAD, моля, уверете се, че се използва същата версия на Qt като за QCAD (вижте Помощ > За QCAD). Моля, уверете се, че ако QCAD се изпълнява в режим release, вашата приставка също е компилирана в режим release.
- Стартирайте QCAD от терминал или командния ред и проверете конзолния изход за съобщения за грешки. Извеждайте съобщения във вашата приставка, за да потвърдите, че се зарежда. Например във вашата функция init.
- Проверете диалога „За” (Помощ > За QCAD > Приставки) за съобщения за грешки.