Pular para o conteúdo

Criar um plugin do QCAD

Os plugins do QCAD podem ser usados para estender o QCAD com funcionalidade implementada em C ou C++.

Todos os plugins do QCAD precisam derivar direta ou indiretamente de QObject e da classe base abstrata RPluginInterface.

Para o nosso primeiro plugin de exemplo minimalista, adicionamos implementações vazias ou minimalistas para a maioria dos métodos de RPluginInterface diretamente no arquivo de cabeçalho. Esta estrutura inicial do arquivo de cabeçalho pode ser copiada para obter um primeiro plugin funcional que pode ser carregado no 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; }
};

Para o método getPluginInfo, adicionamos uma implementação simples ao arquivo cpp para conseguirmos ver algo na caixa de diálogo “Sobre” do 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

Para compilar o nosso plugin, também precisamos de um arquivo de projeto Qt que possa ser transformado em um Makefile com o Qt qmake.

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

O include na linha 3 deve apontar para o arquivo shared.pri da instalação do código-fonte do QCAD (por exemplo, qcad/shared.pri). Como DESTDIR, você pode querer escolher a pasta plugins de uma instalação funcional do QCAD, para que o plugin seja compilado no lugar certo, de onde também pode ser carregado pelo QCAD.

O seu plugin pode ser compilado com estes três arquivos, criando o arquivo qcad/plugins/qcadexample.dll ou libqcadexample.so ou libqcadexample.dylib.

Observação: se você executar um binário do QCAD compilado no modo debug, o plugin também deve ser compilado no modo debug. Se você executar o QCAD no modo release, o plugin deve ser compilado igualmente no modo release.

Para compilar o plugin no modo debug, execute:

Linux / macOS:

qmake
make debug

Windows:

qmake
nmake debug

Para compilar no modo release, execute make release ou nmake release em vez disso.

Obviamente, o plugin ainda não fará nada útil, mas você deverá conseguir ver o seu plugin na caixa de diálogo “Sobre” do QCAD:

O plugin de exemplo listado na caixa de diálogo Sobre do QCAD

Se você não conseguir ver o seu plugin, verifique se há erros no terminal ao iniciar o QCAD. Você também pode ver uma mensagem de erro na caixa de diálogo “Sobre”.

Os plugins do QCAD podem ser usados para compilar uma coleção de scripts e outros recursos (arquivos UI, ícones, etc.) em um plugin. Isso tem a vantagem de que o código de vários arquivos ECMAScript pode ser agrupado dentro de um único arquivo binário compilado. Os plugins tendem a carregar mais rápido do que arquivos individuais do disco e ocupam menos espaço em disco.

Vamos supor que exista uma pasta scripts/MyTool com um arquivo MyTool.js que contém uma ferramenta do QCAD, implementada em ECMAScript. A ferramenta se adiciona no topo do menu Miscelânea e emite “Hello World” quando é acionada.

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"]);
};

Para compilar esta ferramenta de script no nosso plugin C++, precisamos criar um arquivo de recursos Qt que aponte ao qmake o arquivo que queremos compilar no plugin:

<!DOCTYPE RCC>
<RCC version="1.0">
<qresource>
<file alias="scripts/MyTool/MyTool.js">scripts/MyTool/MyTool.js</file>
</qresource>
</RCC>

O arquivo qrc lista os caminhos sob os quais os recursos devem ser disponibilizados no sistema de recursos do Qt (alias=“scripts/MyTool/MyTool.js”) e o caminho real onde o arquivo pode ser encontrado no disco (usado apenas para a compilação). O exemplo acima significa que há um arquivo no disco em scripts/MyTool/MyTool.js que será compilado no plugin. Assim que o plugin for carregado, o arquivo estará disponível sob o caminho “:/scripts/MyTool/MyTool.js”. O QCAD encontrará a ferramenta automaticamente sob esse caminho, pois ele varre tanto a pasta “scripts” quanto “:/scripts” em busca de scripts.

Também precisamos adicionar o arquivo qrc ao arquivo de projeto (exampleplugin.pro) adicionando a seguinte linha:

RESOURCES = scripts.qrc

Após editar o arquivo exampleplugin.pro, execute qmake e make novamente e carregue o plugin. Agora deve haver uma entrada de menu “MyTool” no topo do menu Miscelânea no QCAD.

Você pode encontrar o código-fonte completo deste plugin de exemplo em:

https://github.com/qcad/qcad/tree/master/support/examples/exampleplugin

  • Se o seu plugin compila mas não pode ser carregado pelo QCAD, certifique-se de que a mesma versão do Qt usada para o QCAD seja utilizada (consulte Ajuda > Sobre o QCAD). Certifique-se de que, se o QCAD for executado no modo release, o seu plugin também esteja compilado no modo release.
  • Inicie o QCAD a partir de um terminal ou da linha de comando e verifique a saída do console em busca de mensagens de erro. Emita mensagens no seu plugin para confirmar que ele está sendo carregado, por exemplo na sua função init.
  • Verifique a caixa de diálogo “Sobre” (Ajuda > Sobre o QCAD > Plugins) em busca de mensagens de erro.