Este tutorial explica cómo compilar un plugin de QCAD.
Contenido
Introducción
Los plugins de QCAD pueden ser utilizados para extender QCAD con funcionalidad implementada en C o C++.
Implementación de RPluginInterface
Todos los plugins de QCAD deben derivar directa o indirectamente de QObject y de la clase base abstracta RPluginInterface.
Archivo RExamplePlugin.h
Para nuestro primer plugin de ejemplo minimalista, añadimos implementaciones vacías o minimalistas para la mayoría de los métodos de RPluginInterface directamente al fichero de cabecera. Esta estructura inicial del fichero de cabecera puede copiarse para obtener un primer plugin funcional que pueda cargarse en QCAD.
1 2 3 4 5 6 7 8 9101112131415161718192021 | #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")#endifpublic: 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; }}; |
Archivo RExamplePlugin.cpp
Para el método getPluginInfo, añadimos una simple implementación al fichero cpp para el beneficio de ver algo en el diálogo acerca de de QCAD.
1 2 3 4 5 6 7 8 91011121314151617 | #include "RExamplePlugin.h "RPluginInfo RExamplePlugin::getPluginInfo() { RPluginInfo ret; ret.set("Versión", "1.0"); ret.set("ID", "EJEMPLO"); ret.set("Nombre", "Plugin de ejemplo"); ret.set("Licencia", "GPLv3"); ret.set("URL", "http://qcad.org"); return ret;}#if QT_VERSION < 0x050000QT_BEGIN_NAMESPACEQ_EXPORT_PLUGIN2(ejemplo, RExamplePlugin)QT_END_NAMESPACE#endif |
Archivo exampleplugin.pro
Para compilar nuestro plugin, también necesitamos un archivo de proyecto Qt que se puede convertir en un Makefile con Qt qmake.
123456789 | CONFIG += pluginTARGET = ejemploinclude(../../../compartido.pri)TEMPLATE = libHEADERS = RExamplePlugin.hSOURCES = RExamplePlugin.cppDESTDIR = ../../../pluginsLIBS += -lqcadcore -lqcadgui -lqcadecmaapi |
El include de la línea 3 debe apuntar al archivo shared.pri de la instalación del código fuente de QCAD (por ejemplo qcad/shared.pri). Como DESTDIR, puede elegir la carpeta de plugins de una instalación de QCAD en funcionamiento, para que el plugin se compile en el lugar correcto desde donde también pueda ser cargado por QCAD.
Compilación
Su plugin puede ser compilado con estos tres archivos, creando el archivo qcad/plugins/qcadexample.dll o libqcadexample.so o libqcadexample.dylib.
Nota: si ejecuta un binario de QCAD compilado en modo depuración, el plugin también debe estar compilado en modo depuración. Si ejecuta QCAD en modo release, el plugin debe compilarse también en modo release.
Para compilar el plugin en modo depuración ejecute:
Linux / macOS:
qmake
make debug
Windows:
qmake
nmake debug
Para compilar en modo release, ejecute make release o nmake release en su lugar.
Obviamente, el plugin no hará nada útil todavía, pero debería poder ver su plugin en el diálogo QCAD about:
Si no puede ver su plugin, por favor compruebe si hay errores en en el terminal mientras arranca QCAD. También podría ver un mensaje de error en el diálogo acerca de.
Compilando Scripts como Recursos en un Plugin
Los plugins de QCAD pueden utilizarse para compilar una colección de scripts y otros recursos (archivos ui, iconos, etc.) en un plugin. Esto tiene la ventaja de que el código de varios archivos ECMAScript puede agruparse en un único archivo binario compilado. Los plugins tienden a cargarse más rápido que los archivos individuales desde el disco y ocupan menos espacio en disco.
Archivo scripts/MyTool/MyTool.js
Supongamos que existe una carpeta scripts/MyTool con un archivo MyTool.js que contiene una herramienta QCAD, implementada en ECMAScript. La herramienta se añade a sí misma en la parte superior del menú Misc y muestra "Hola Mundo" cuando se activa.
1 2 3 4 5 6 7 8 9101112131415161718192021222324 | 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("Hola Mundo"); 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"]);}; |
Archivo scripts.qrc
Para compilar esta herramienta de scripts en nuestro plugin C++, necesitamos crear un archivo de recursos Qt que apunte a qmake al archivo que queremos compilar en el plugin:
12345 | <!DOCTYPE RCC><RCC version="1.0"> <qresource> <file alias="scripts/MyTool/MyTool.js">scripts/MyTool/MyTool.js</file> </qresource></RCC> |
El archivo qrc enumera las rutas bajo las cuales los recursos deben estar disponibles en el sistema de recursos de Qt (alias="scripts/MyTool/MyTool.js") y la ruta real donde el archivo puede encontrarse en el disco (utilizada sólo para la compilación). El ejemplo anterior significa que existe un archivo en disco bajo scripts/MyTool/MyTool.js que será compilado en el plugin. En cuanto se cargue el plugin, el archivo estará disponible bajo la ruta ":/scripts/MyTool/MyTool.js". QCAD encontrará la herramienta automáticamente bajo esa ruta ya que escanea la carpeta "scripts" así como ":/scripts" en busca de scripts.
También necesitamos añadir el archivo qrc al archivo del proyecto (exampleplugin.pro) añadiendo la siguiente línea:
RECURSOS = scripts.qrc
Después de editar el archivo exampleplugin.pro, ejecute qmake y make de nuevo y cargue el plugin. Ahora debería haber una entrada de menú "MyTool" en la parte superior del menú Misc en QCAD.
Código fuente
Puede encontrar el código fuente completo de este plugin de ejemplo en:
https://github.com/qcad/qcad/tree/master/support/examples/exampleplugin
Solución de problemas
- Si su plugin compila pero no puede ser cargado por QCAD, por favor asegúrese de que se utiliza la misma versión de Qt que para QCAD (ver Ayuda > Acerca de QCAD). Por favor, asegúrese de que si QCAD se ejecuta en modo release, su plugin también se compila en modo release.
- Ejecute QCAD desde un terminal o la línea de comandos y compruebe la salida de la consola en busca de mensajes de error. Produzca mensajes en su plugin para confirmar que se está cargando. Por ejemplo en su función init.
- Compruebe el diálogo acerca de(Ayuda > Acerca de QCAD > Plugins) en busca de mensajes de error.