插件

quardCRT 從 V0.4.0 開始支援外掛。外掛以 Qt 外掛方式實作,並以動態函式庫形式載入。

本頁同時說明兩個面向:

  • 一般使用者如何理解與使用外掛功能

  • 開發者如何基於 quardCRT 外掛 API 編寫外掛

面向使用者

外掛可依自身能力,從多個方向擴充 quardCRT,例如:

  • 為主介面加入動作或選單

  • 向終端右鍵選單加入項目

  • 在應用側邊欄區域提供自訂外掛面板

  • 觸發與連線相關的操作,例如開啟 SSH、序列埠、Raw Socket 或 VNC 工作階段

quardCRT 亦提供外掛資訊視窗,用於展示外掛狀態、相容性資訊與初始化錯誤。

外掛載入行為

啟動時,quardCRT 會嘗試從自身外掛目錄載入內建外掛。如果你在應用設定中配置了額外的外掛目錄,也會嘗試從該目錄載入外掛。

若某個外掛載入失敗,quardCRT 不會靜默地將其視為成功,而是會在外掛資訊對話框中記錄失敗原因。

常見原因包括:

  • 缺少外掛中繼資料

  • 外掛 API 版本不受支援

  • 初始化失敗

  • 缺少 quardCRT 預期的選單或元件入口點

啟用與停用外掛

外掛啟用狀態會儲存在應用設定中。對於支援的外掛,可在外掛資訊對話框中啟用或停用。

這在以下場景中很有用:

  • 想暫時停用某個外掛而不刪除其檔案

  • 測試新外掛時希望可以快速回退

  • 想在不同機器上使用不同的外掛組合

面向開發者

API

外掛 API 規範維護在 plugininterface 倉庫中。

開發自訂外掛時,常見流程如下:

  • 包含 plugininterface.h 標頭檔

  • 定義外掛類別並繼承 PluginInterface

  • 實作 PluginInterface 要求的方法

  • 針對目標平台建構 dllsodylib 等原生外掛函式庫

  • 將建構好的外掛放到 quardCRT 可以載入的位置

實際上,一個有用的外掛通常會提供以下一項或多項能力:

  • 主選單動作或選單

  • 側邊欄面板

  • 終端右鍵選單項目

  • 透過外掛設定讀寫鉤子儲存自己的設定

  • 透過 setLanguage()retranslateUi() 實作多語言支援

以下是一個最簡單的示例:

#include "plugininterface.h"

#include <QMap>
#include <QMessageBox>
#include <QDebug>

#define PLUGIN_NAME    "Hello World"
#define PLUGIN_VERSION "0.0.1"

class HelloWorld : public PluginInterface
{
	Q_OBJECT
	Q_PLUGIN_METADATA(IID "org.quardCRT.PluginInterface" FILE "../plugininterface.json")
	Q_INTERFACES(PluginInterface)

public:
	HelloWorld() : m_action(nullptr) {}
	virtual ~HelloWorld() {}

	int init(QMap<QString, QString> params, QWidget *parent) {
		foreach (QString key, params.keys()) {
			qDebug() << key << " : " << params[key];
		}
		qDebug() << "Hello World init";
		m_action = new QAction("Hello World", parent);
		connect(m_action, &QAction::triggered, [parent](){
			QMessageBox::information(parent, "Hello World", "Hello World");
		});

		return 0;
	}

	void setLanguage(const QLocale &language,QApplication *app) {Q_UNUSED(language);Q_UNUSED(app);}
	void retranslateUi() {}
	QString name() { return PLUGIN_NAME; }
	QString version() { return PLUGIN_VERSION; }

	QMap<QString,void *> metaObject() {
		QMap<QString,void *> ret;
		ret.insert("QAction", (void *)m_action);
		return ret;
	}

	QMenu *terminalContextMenu(QString selectedText, QString workingDirectory, QMenu *parentMenu) {Q_UNUSED(selectedText);Q_UNUSED(workingDirectory);Q_UNUSED(parentMenu); return nullptr;}
	QList<QAction *> terminalContextAction(QString selectedText, QString workingDirectory, QMenu *parentMenu) {Q_UNUSED(selectedText);Q_UNUSED(workingDirectory);Q_UNUSED(parentMenu); return QList<QAction *>();}

private:
	QAction *m_action;
};

模板工程

對於新的外掛開發,建議使用 GitHub 模板工程 plugin-template

該模板已包含:

  • 外掛開發所需的專案結構

  • 建構腳本與工程配置

  • 基於 GitHub Actions 的 CI 設定

這樣你可以把更多精力放在外掛邏輯本身,而不是從零建立專案骨架。

相容性說明

建構外掛時,請留意以下幾點:

  • 外掛必須匹配執行中 quardCRT 所期望的外掛 API 版本

  • 外掛是原生二進位,因此編譯器、Qt 版本、架構與平台相容性都很重要

  • 如果外掛依賴額外共享函式庫,這些函式庫在執行階段也必須可用

如果一個外掛看起來沒問題但仍然無法載入,外掛資訊視窗通常是第一個排查位置。

範例

目前 quardCRT 已有一些開源外掛,可作為開發參考:

為終端右鍵選單加入搜尋動作,可將選中文本快速送到 Google、Bing、百度、GitHub 等服務。

提供使用者自訂命令,用於快速傳送到目前工作階段。

提供預填 SSH 資訊與更高效的主機選擇流程,在嵌入式開發或裝置初始化場景中較為實用。

更多

若想了解更多資訊、模板與相關倉庫,請參考 quardCRT 外掛開放平台:

外掛系統仍在持續演進中。如果你對外掛 API、擴充點或開發者工具有想法,歡迎在 GitHub 或 Gitee 上提交 issue 或 discussion。