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
分类:
C++/Qt
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性