Qt 插件化编程

Qt插件机制

1、通过插件扩展应用程序功能
A、定义一个接口集(只有纯虚函数的类),用来与插件交流。
B、用宏Q_DECLARE_INTERFACE()将该接口告诉Qt元对象系统。
C、应用程序中用QPluginLoader来加载插件。
D、用宏qobject_cast()来判断一个插件是否实现了接口。

2、创建插件
A、声明插件类,插件类继承自QObject和插件实现的接口。
B、用宏Q_INTERFACES()将插件接口告诉Qt元对象系统。(注意Qt版本)
C、用宏Q_EXPORT_PLUGIN2()导出插件类。(注意Qt版本)
D、用适当的.pro文件构建插件。
注:在加载插件前,QCoreApplication对象必须被初始化。

Qt插件类创建

 1 ////step 1 定义接口类
 2 class RegExpInterface
 3 {
 4 public:
 5     virtual ~RegExpInterface() {}
 6     virtual QString regexp(const QString &message) = 0;
 7 };
 8 ////step 2 声明是接口类(接口类中)
 9 // 使用 Q_DECLARE_INTERFACE 宏,是为了让Qt元对象系统知道该接口,这样以来,在运行时便可以识别实现接口的插件。
10 // Q_DECLARE_INTERFACE(接口类名, 接口标识),第二个参数(RegExpInterface_iid)是一个标识接口的字符串,必须唯一。
11 #define RegExpInterface_iid "org.qter.Examples.myplugin.RegExpInterface"
12 Q_DECLARE_INTERFACE(RegExpInterface,RegExpInterface_iid )
13 #endif // REGEXPINTERFACE_H
14 ////step 3 实现接口
15 class REGEXPLUGINSHARED_EXPORT RegexPlugin : public QObject,RegExpInterface
16 {
17     Q_OBJECT
18     //Q_PLUGIN_METADATA宏用于描述插件元数据,第一个参数为插件的 IID,与接口定义的IID相同
19     //第二个参数FILE是可选的,指定一个本地json文件,该文件中描述插件的相关数据信息
20     Q_PLUGIN_METADATA(IID RegExpInterface_iid FILE "regexplugindata.json")
21     //Q_INTERFACES 宏用于告诉 Qt 该类实现的接口。
22     Q_INTERFACES(RegExpInterface)
23 public:
24     RegexPlugin();
25     // RegExpInterface interface
26 public:
27     QString regexp(const QString &message);
28 };
29 ////step 4 使用接口
30 // 进入插件目录
31 QDir pluginsDir(qApp->applicationDirPath());
32 pluginsDir.cd("bin");
33 // 遍历插件目录
34 foreach (QString fileName, pluginsDir.entryList(QDir::Files)) {
35     QPluginLoader pluginLoader(pluginsDir.absoluteFilePath(fileName));
36     QObject *plugin = pluginLoader.instance();
37     if (plugin) {
38         //取回json文件的内容
39         QJsonObject w = pluginLoader.metaData().value("MetaData").toObject();
40         qDebug()<<w;
41         regexpInterface = qobject_cast<RegExpInterface *>(plugin);
42         if (regexpInterface)
43             return true;
44     }
45 }
博客园文作者:Citrusliu 博文地址:https://www.cnblogs.com/citrus
原文地址:https://www.cnblogs.com/citrus/p/15770469.html