这篇是接上一篇的下文,来讲解Qt Plugin系统的另一部分,低等级插件(其实叫低等插件就会感觉这个插件有些低级,但是我用起来感觉并不低级哈,或者翻译成底层插件更合适一个吼,所以我还是把他称作程序扩展插件或插件(本文提到的插件都是低等插件)吧。),这可能是用的更广泛的一种?Maybe。如果是在工程领域的话应该这种用的比较常见,作为应用程序的补充动态库来用。
虽然说是低等级插件,我觉得他用起来比高等级插件更难一些,不像高等级插件很多东西Qt已经写好了,低等级插件工厂模式还要自己去写。
先介绍一下我们项目吧
项目背景
我们项目是做一个高端可编程传感系统的自动化测试系统,用来测试这个传感系统相关指标是否达标了。并输出报告等功能。
由于工厂产的传感系统有不同型号,每个型号的指标和通讯协议都不甚相同,所以给每个型号定制一个插件是有必要的,当测这个型号的时候软件就加载则个型号的插件做相应的测试,做另一个型号的时候就加载另一个插件。
一个型号的产品可能同时会测多个,可能有16个这么多,所以用Qt官方指导那种普通的程序扩展插件就不是很合理了(后面会进行讲解),指导中程序扩展插件是加载一个用一个,而我们需要从一个插件中,生成16个实体,这里的话就要用到工厂模式(和高等级插件的factory是一种,Qt好像并没有吧工厂模式显示的暴露出来,我写上一篇的时候找了好久才找到源码),通过一种插件,create出16个实体同时工作(多线程的问题以后再讲)。
官方指导中的低等插件讲解
以下是官方文档的解释:
不仅Qt本身,Qt应用程序也可以通过插件进行扩展。这要求应用程序使用QPluginLoader检测和加载插件。在这种情况下,插件可以提供任意功能,并且不限于数据库驱动程序、图像格式、文本编解码器、样式以及扩展Qt功能的其他类型的插件。
通过插件使应用程序可扩展包括以下步骤:
- 定义一组用于与插件对话的接口(仅具有纯虚拟函数的类)//这里也可以不是“仅”具有纯虚函数的类
- 使用Q_DECLARE_INTERFACE()宏告诉Qt的元对象系统该接口。
- 在应用程序中使用QPluginLoader加载插件。
- 使用qobject_cast()测试插件是否实现给定接口。
编写插件包括以下步骤:
- 声明一个插件类,该类继承自QObject和插件想要提供的接口。
- 使用Q_INTERFACES()宏告诉Qt的元对象系统有关接口的信息。
- 使用Q_plugin_METADATA()宏导出插件。
- 使用合适的方法构建插件.pro文件。
然后按照步骤依次讲解
定义一组用于与插件对话的接口(EchoInterface)(仅具有纯虚拟函数的类)//这里也可以不是“仅”具有纯虚函数的类