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 }