制作Qt应用程序的插件(使用QtPlugin),对比DLL它是全平台通用的

在Qt下,插件有两种形式,一种是用于QtCreator下,扩展IDE功能。另一种是用于扩展开发者的应用。本文要讲的是后者。

定义一个纯虚类作为插件接口

  1. #include <QtPlugin>
  2. #include <QString>
  3. class IMyPlugin
  4. {
  5. public:
  6. virtual QString Hello() = 0;
  7. };
  8. Q_DECLARE_INTERFACE(IMyPlugin, "com.apple.im.plugin.IMyPlugin")

最后一行的Q_DECLARE_INTERFACE宏告诉Qt这个纯虚类是一个插件接口。
第一个参数是接口类名,第二个参数是插件标识符,标识符是大小写敏感的且必须是唯一的。

接着就是接口的具体实现了

  1. class MyPlugin : public QObject, public IMyPlugin
  2. {
  3. Q_OBJEC
  4. Q_PLUGIN_METADATA(IID "com.google.myplugin" FILE "C:/a.json")
  5. Q_INTERFACES(IMyPlugin)
  6. public:
  7. virtual QString Hello() Q_DECL_OVERRIDE;
  8. };

实现类必须继承自QObject和插件接口类。Q_PLUGIN_METADATA宏用于描述插件元数据,第一个参数IID是必须的,同插件标识一样
而第二个参数FILE是可选的,指定一个本地json文件,该文件中可以描述插件的相关数据信息
(上面代码中指向的a.json内容为{"name":"jack", "age":18},稍后可以看到)

测试方法的实现没啥好说了,只是返回一个字符串

  1. QString MyPlugin::Hello()
  2. {
  3. return "Hello";
  4. }

调用的话也比较简单,就是通过QPluginLoader类

  1. {
  2. QPluginLoader loader("C:/MyPlugin.dll");
  3. if (loader.load())
  4. {
  5. QObject *obj = loader.instance();
  6. if (obj)
  7. {
  8. IMyPlugin *plugin = qobject_cast<IMyPlugin*>(obj);
  9. if (plugin)
  10. {
  11. // 测试插件方法
  12. qDebug() << plugin->Hello();
  13. // 输出插件元数据
  14. qDebug() << loader.metaData();
  15. }
  16. // 需要手动释放
  17. delete obj;
  18. }
  19. }
  20. }

最后运行结果如图

制作Qt应用程序的插件(使用QtPlugin),对比DLL它是全平台通用的

http://blog.csdn.net/aqtata/article/details/38986271

上一篇:微信小程序自定义弹窗wcPop插件|仿微信弹窗样式


下一篇:jQuery实现页内查找相关内容