# qt.plugin-dev **Repository Path**: zinface/qt.plugin-dev ## Basic Information - **Project Name**: qt.plugin-dev - **Description**: 一个简单的Qt插件示例 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2022-08-30 - **Last Updated**: 2024-12-27 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # qt.plugin-dev > 一个简单的 qt 插件示例 Qt Plugin Guide 测试方案: 1. 插件声明定义 `(iplugin.h)`, 一个`IPlugin`类\ 一个用于描述插件接口规范的头文件,开发插件的库需要以这个接口为基础来实现其插件的功能。 创建一个 IPlugin 类\ 用于描述接口信息,提供虚拟函数 `PluginName()` 被插件实现及插件加载程序调用 ```cpp // 定义一个插件所使用的 IID 名称,被实现的插件也可以使用此宏 #define IPlugin_IID "com.test.plugin" class IPlugin { public: // 定义一个插件时所用的名称 virtual QString PluginName() = 0; // 插件声明函数必须 = 0 }; Q_DECLARE_INTERFACE(IPlugin, IPlugin_IID) ``` 2. 创建一个 `demo` 插件实现类,它需要被指定编译标志 ```cpp #include "iplugin.h" class PluginDemo : public QObject, IPlugin { Q_OBJECT Q_PLUGIN_METADATA(IID IPlugin_IID) Q_INTERFACES(IPlugin) public: QString PluginName() override; }; ``` ```cpp #include "plugindemo.h" QString PluginDemo::PluginName() { return QString("插件demo"); } ``` ```cmake # 不过没设定好像也没啥问题 add_definitions("${QT_DEFINITIONS} -DQT_PLUGIN") # 该库编译将产生一个 `libplugindemo.so`,在 cmake 中应当被指定为 SHARED 共享库目标 ``` 3. 创建 `main.cpp` 实现 `plugin-loader` 程序加载指定的 so 文件,加载正常后将会调用 `demo` 插件接口函数 `PluginName()` 并打印 ```cpp IPlugin *plugin; // 使用 QPluginLoader,参数 argv[1] 表示为插件路径 QPluginLoader pluginLoader(argv[1]); // 使用插件加载器加载扩展并尝试创建实例 QObject *instance = pluginLoader.instance(); if (instance) { // 如果实例创建成功,尝试转换对象 plugin = qobject_cast(instance); if (plugin) { QTextStream(stdout) << QString("> 加载插件并调用函数:\n") << "> plugin->PluginName(): " << plugin->PluginName() << "\n"; } pluginLoader.unload(); } ``` 4. 构建与运行\ 执行 `make run` 进行自动构建与运行当前示例 ```bash # 将会在 build 目录中,执行以下命令加载插件(因Qt插件机制必须为'绝对路径') $ ./plugin-loader `realpath libplugindemo.so` plugin->PluginName: 插件demo ```