插件接口
更新于 2026-10-12
插件类须继承 QObject 与 S7AA7::I7AA7Plugin,并实现四个核心方法。
一、四个核心接口
| 方法 | 调用时机 | 职责 |
|---|
getPluginMetaInfo() | 加载成功后立即 | 返回插件元信息;必须轻量、可重入、无副作用 |
pluginInit(hostApi) | 版本校验通过且启用 | 初始化;保存 I7AA7HostApi*;返回失败即视为损坏 |
getPluginWidget(parent) | 用户点击二级菜单 | 返回嵌入内容区的 QWidget |
pluginUninstall() | 禁用 / 卸载 / 关闭 | 释放定时器、线程、句柄、缓存 |
二、可选接口(末尾追加,默认空实现)
| 方法 | 说明 |
|---|
pluginSignature() | 返回 DLL 字节的 RSA 签名;第三方无需实现(由服务端签名) |
callService(serviceId, args) | 开放插件间服务,供 callPluginService 路由调用 |
onRefreshRequested() | 用户手动「刷新检索」后触发,可重新扫描自己的数据 |
| 字段 | 类型 | 说明 |
|---|
pluginId | QString | 插件唯一 ID(反向域名,全插件不重复) |
pluginName | QString | 显示名称 |
pluginAuthor | QString | 作者 / 组织 |
pluginVersion | QString | 语义化版本,如 1.0.3 |
hostMinimumVersion | QString | 要求的最低主程序版本 |
shortDescription | QString | 一行简介(列表展示) |
longDescription | QString | 详细说明(可含换行) |
iconKey | QString | 可选图标键 |
category | QString | 可选分类(预留) |
extra | QVariantMap | 可扩展字段,增删不破坏 ABI |
extra 约定键:homepage、license、tags、signature、network_access、network_domains。
四、加载错误码
| 枚举 | 含义 |
|---|
Ok | 加载成功 |
NotAQtPlugin | 非 Qt 插件(缺 Q_PLUGIN_METADATA) |
WrongInterface | 未实现 I7AA7Plugin(IID 不匹配) |
MetaInfoInvalid | 插件名或 id 为空 |
VersionTooHigh | 要求的最低版本高于当前主程序 |
DisabledByConfig | 被本地配置禁用(非错误) |
FileCorrupted | DLL 损坏或不可读 |
PlatformMismatch | Debug / 32 位 / 编译器不匹配 |
InstanceCreationFailed | IID 匹配但 instance() 返回空 |
InitRaisedException | pluginInit() 抛异常或返回失败 |
SignatureInvalid | 数字签名校验失败 |
五、类骨架
cpp
#include <QObject>
#include "../include/I7AA7Plugin.h"
#include "../include/7AA7PluginMacros.h"
class MyPlugin : public QObject, public S7AA7::I7AA7Plugin
{
Q_OBJECT
Q_PLUGIN_METADATA(IID I7AA7PLUGIN_IID FILE "MyPlugin.json")
Q_INTERFACES(S7AA7::I7AA7Plugin)
public:
S7AA7::PluginMetaInfo getPluginMetaInfo() const override
{
S7AA7::PluginMetaInfo m;
m.pluginId = "com.company.myplugin";
m.pluginName = "";
m.pluginVersion = "1.0.0";
m.hostMinimumVersion = "2.1.0";
m.shortDescription = "";
return m;
}
bool pluginInit(S7AA7::I7AA7HostApi* hostApi) override
{ m_hostApi = hostApi; return true; }
QWidget* getPluginWidget(QWidget* parent) override
{ auto* w = new QWidget(parent); /* 构建你的界面 */ return w; }
void pluginUninstall() override { m_hostApi = nullptr; }
private:
S7AA7::I7AA7HostApi* m_hostApi = nullptr;
};