Ein natives Plugin schreiben¶
Ein minimales natives Plugin besteht aus einer Klasse, einem Factory-Makro,
einer JSON-Datei und einer kurzen CMakeLists.txt. Sie können es vollständig
außerhalb des Quellbaums gegen das Plugin-SDK entwickeln — ein Checkout der
MTE-Quellen ist nicht erforderlich.
Nativ oder Python?
Diese Seite behandelt native C++-Plugins (kompiliert zu einer
.dll/.so/.dylib und vom Qt-Loader geladen). Wenn Sie lieber einen
Ordner mit .py-Dateien ausliefern, den der Editor als Subprozess startet,
lesen Sie Python-Plugins — dieselbe
PluginApi-Oberfläche, anderes Backend, kein Compiler nötig.
Entwurf
Diese Anleitung basiert auf PLUGIN_ARCHITECTURE.md; prüfen Sie den genauen
SDK-Paketnamen und die Argumente von mte_add_plugin() gegen das
ausgelieferte SDK, bevor Sie sich darauf verlassen.
1. IPlugin implementieren¶
#include <PluginApi/IPlugin.h>
#include <PluginApi/IPluginContext.h>
class HelloWorldPlugin : public MTE::plugin::IPlugin {
public:
MTE::plugin::PluginInfo info() const override {
return { "org.mte.helloworld", "Hello World", "1.0.0",
"Example Vendor", "Says hi.", MTE_PLUGIN_API_VERSION };
}
bool initialize(MTE::plugin::IPluginContext& ctx) override {
m_cmd = ctx.commands().registerCommand(
{ "helloworld.sayHi", "Say Hi", "Ctrl+Alt+H", "Hello" },
[&ctx] { ctx.log().log(MTE::plugin::LogLevel::Info, "Hi!"); });
m_menu = ctx.menus().addItem("Plugins/Say Hi", "helloworld.sayHi");
return true;
}
void shutdown() noexcept override {} // tokens tear down automatically
private:
MTE::plugin::CommandToken m_cmd;
MTE::plugin::MenuToken m_menu;
};
2. Die Factory exportieren (natives Qt-Backend)¶
#include <PluginApi/Qt/PluginQtGlue.h>
class HelloWorldFactory : public QObject, public MTE::plugin::IPluginFactory {
Q_OBJECT
Q_PLUGIN_METADATA(IID "org.mte.IPluginFactory/1" FILE "plugin.json")
Q_INTERFACES(MTE::plugin::IPluginFactory)
public:
std::unique_ptr<MTE::plugin::IPlugin> create() override {
return std::make_unique<HelloWorldPlugin>();
}
};
3. In plugin.json beschreiben¶
{
"id": "org.mte.helloworld",
"name": "Hello World",
"version": "1.0.0",
"apiVersion": 1,
"entry": "native",
"requires": [],
"order": 600,
"menus": [
{ "title": "Plugins", "barPriority": 570, "itemPriority": 100 }
]
}
Die apiVersion hier und die von info() zurückgegebene müssen beide
gleich MTE_PLUGIN_API_VERSION sein, andernfalls verweigert der Host das Laden
des Plugins.
Mitgelieferte Bibliotheken attributieren — thirdParty¶
Wenn Ihr Plugin eine Drittanbieter-Komponente bündelt oder dagegen linkt,
deklarieren Sie sie in einem optionalen thirdParty-Array, damit der Editor
seine Attributionspflichten erfüllen kann:
"thirdParty": [
{ "name": "Qt WebEngine", "license": "LGPL-3.0",
"url": "https://doc.qt.io/qt-6/qtwebengine-index.html",
"file": "QtWebEngine-LGPLv3.txt" }
]
Jeder Eintrag benötigt einen name (Einträge ohne Namen werden verworfen);
license, url und file sind optional. Ihr Plugin ist Eigentümer der
Lizenztexte — liefern Sie sie neben dem Plugin unter
Plugins/Licenses/<your-plugin-id>/ aus, wobei file der Basisname ist. Der
About-Dialog listet die thirdParty-Komponenten jedes installierten
Plugins auf und verweist die Benutzer auf diesen Ordner; der Kern trägt die
Drittanbieter-Texte eines Plugins niemals selbst. (Das mitgelieferte
HtmlPreviewPlugin, das QtWebEngine + Chromium einbettet, ist das
Referenzbeispiel.)
4. Bauen¶
Verwenden Sie den CMake-Helfer des SDK:
find_package(MTEPluginSDK REQUIRED)
mte_add_plugin(NAME HelloWorldPlugin
SOURCES Src/HelloWorldPlugin.cpp
# TRANSLATIONS Translations/HelloWorld_en.ts ...
)
5. Installieren & ausführen¶
Packen Sie entweder die gebaute Bibliothek + plugin.json als
<name>.mteplugin in ein Zip und installieren Sie es über
Einstellungen ▸ Plugins ▸ Install… (das Paket wird validiert — Manifest,
Archivsicherheit und die eingebetteten Metadaten der Binärdatei —, bevor
irgendetwas angefasst wird), oder legen Sie die Dateien von Hand in ein
erkanntes Plugin-Verzeichnis (siehe
Architekturüberblick). Starten Sie den Editor
neu; aktivieren Sie das Plugin bei Bedarf unter Einstellungen ▸ Plugins.
Weiter¶
- Plugin-API-Überblick — Lebenszyklus, Tokens und die vollständige Diensttabelle
- Commands & Menüs
- Docks, Tabs & Statusleiste
- Einstellungsseiten
- Events
- Übersetzungen