Membuat Plugin QCAD
Pendahuluan
Section titled “Pendahuluan”Plugin QCAD dapat digunakan untuk memperluas QCAD dengan fungsionalitas yang diimplementasikan dalam C atau C++.
Mengimplementasikan RPluginInterface
Section titled “Mengimplementasikan RPluginInterface”Semua plugin QCAD harus diturunkan secara langsung atau tidak langsung dari QObject dan kelas dasar abstrak RPluginInterface.
Berkas RExamplePlugin.h
Section titled “Berkas RExamplePlugin.h”Untuk plugin contoh pertama kita yang minimalis, kita menambahkan implementasi kosong atau minimalis untuk sebagian besar metode RPluginInterface langsung ke dalam berkas header. Struktur awal berkas header ini dapat disalin untuk mendapatkan plugin pertama yang berfungsi yang dapat dimuat ke dalam 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; }};Berkas RExamplePlugin.cpp
Section titled “Berkas RExamplePlugin.cpp”Untuk metode getPluginInfo, kita menambahkan implementasi sederhana ke berkas cpp agar ada sesuatu yang terlihat di dialog tentang 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#endifBerkas exampleplugin.pro
Section titled “Berkas exampleplugin.pro”Untuk mengompilasi plugin kita, kita juga memerlukan berkas proyek Qt yang dapat diubah menjadi Makefile dengan Qt qmake.
CONFIG += pluginTARGET = exampleinclude(../../../shared.pri)
TEMPLATE = libHEADERS = RExamplePlugin.hSOURCES = RExamplePlugin.cppDESTDIR = ../../../pluginsLIBS += -lqcadcore -lqcadgui -lqcadecmaapiInclude pada baris 3 harus menunjuk ke berkas shared.pri dari instalasi kode sumber QCAD (mis. qcad/shared.pri). Sebagai DESTDIR, Anda mungkin ingin memilih folder plugins dari instalasi QCAD yang berfungsi, sehingga plugin dikompilasi di tempat yang tepat, dari mana ia juga dapat dimuat oleh QCAD.
Kompilasi
Section titled “Kompilasi”Plugin Anda dapat dikompilasi dengan ketiga berkas ini, menghasilkan berkas qcad/plugins/qcadexample.dll atau libqcadexample.so atau libqcadexample.dylib.
Catatan: jika Anda menjalankan biner QCAD yang dikompilasi dalam mode debug, plugin juga harus dikompilasi dalam mode debug. Jika Anda menjalankan QCAD dalam mode release, plugin harus dikompilasi dalam mode release juga.
Untuk mengompilasi plugin dalam mode debug, jalankan:
Linux / macOS:
qmakemake debugWindows:
qmakenmake debugUntuk mengompilasi dalam mode release, jalankan make release atau nmake release sebagai gantinya.
Tentu saja, plugin belum melakukan sesuatu yang berguna, tetapi Anda seharusnya dapat melihat plugin Anda di dialog tentang QCAD:
Jika Anda tidak dapat melihat plugin Anda, harap periksa kesalahan di terminal saat memulai QCAD. Anda mungkin juga melihat pesan kesalahan di dialog tentang.
Mengompilasi Skrip sebagai Sumber Daya ke dalam Plugin
Section titled “Mengompilasi Skrip sebagai Sumber Daya ke dalam Plugin”Plugin QCAD dapat digunakan untuk mengompilasi sekumpulan skrip dan sumber daya lain (berkas ui, ikon, dll.) ke dalam sebuah plugin. Ini memiliki keuntungan bahwa kode dari beberapa berkas ECMAScript dapat digabungkan ke dalam satu berkas biner terkompilasi. Plugin cenderung dimuat lebih cepat daripada berkas individual dari disk dan memakan lebih sedikit ruang penyimpanan.
Berkas scripts/MyTool/MyTool.js
Section titled “Berkas scripts/MyTool/MyTool.js”Anggaplah ada folder scripts/MyTool dengan berkas MyTool.js yang berisi sebuah alat QCAD, diimplementasikan dalam ECMAScript. Alat tersebut menambahkan dirinya sendiri di bagian atas menu Lain-lain dan menampilkan “Hello World” ketika dipicu.
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"]);};Berkas scripts.qrc
Section titled “Berkas scripts.qrc”Untuk mengompilasi alat skrip ini ke dalam plugin C++ kita, kita perlu membuat berkas sumber daya Qt yang mengarahkan qmake ke berkas yang ingin kita kompilasi ke dalam plugin:
<!DOCTYPE RCC><RCC version="1.0"> <qresource> <file alias="scripts/MyTool/MyTool.js">scripts/MyTool/MyTool.js</file> </qresource></RCC>Berkas qrc mencantumkan jalur di mana sumber daya akan disediakan dalam sistem sumber daya Qt (alias=“scripts/MyTool/MyTool.js”) dan jalur sebenarnya tempat berkas dapat ditemukan di disk (hanya digunakan untuk kompilasi). Contoh di atas berarti terdapat sebuah berkas di disk di scripts/MyTool/MyTool.js yang akan dikompilasi ke dalam plugin. Segera setelah plugin dimuat, berkas tersebut akan tersedia di jalur “:/scripts/MyTool/MyTool.js”. QCAD akan menemukan alat tersebut secara otomatis di jalur itu karena ia memindai folder “scripts” serta “:/scripts” untuk mencari skrip.
Kita juga perlu menambahkan berkas qrc ke berkas proyek (exampleplugin.pro) dengan menambahkan baris berikut:
RESOURCES = scripts.qrcSetelah mengedit berkas exampleplugin.pro, jalankan qmake dan make lagi lalu muat plugin. Sekarang seharusnya ada entri menu “MyTool” di bagian atas menu Lain-lain di QCAD.
Kode Sumber
Section titled “Kode Sumber”Anda dapat menemukan kode sumber lengkap untuk plugin contoh ini di:
https://github.com/qcad/qcad/tree/master/support/examples/exampleplugin
Pemecahan Masalah
Section titled “Pemecahan Masalah”- Jika plugin Anda berhasil dikompilasi tetapi tidak dapat dimuat oleh QCAD, pastikan versi Qt yang sama digunakan seperti untuk QCAD (lihat Bantuan > Tentang QCAD). Pastikan bahwa jika QCAD dijalankan dalam mode release, plugin Anda juga dikompilasi dalam mode release.
- Luncurkan QCAD dari terminal atau baris perintah dan periksa keluaran konsol untuk pesan kesalahan. Tampilkan pesan keluaran di plugin Anda untuk memastikan plugin sedang dimuat. Misalnya di dalam fungsi init Anda.
- Periksa dialog tentang (Bantuan > Tentang QCAD > Plugins) untuk pesan kesalahan.