Qt中为我们提供了两种开发插件的方式。一种是使用High-Level API接口,一种是使用Low-Level API接口。所谓High-Level API 是指通过继承Qt为我们提供的特定的插件基类,然后实现一些虚函数、添加需要的宏即可。该种插件开发方式主要是用来扩展Qt库本身的功能,比如自定义数据库驱动、图片格式、文本编码、自定义样式等。而我们为自己的应用程序编写插件来扩展其功能时主要使用第二种方式,即Low-Level API 的方式,该方式不仅能扩展我们自己的应用程序,同样也能像High-Level API 那样用来扩展Qt本身的功能。使用这种方式,我们可以将我们需要扩展的功能写成一个 接口,然后让一个插件类去实现这个接口的功能,再使用Qt提供的用于插件开发的宏,按Qt要求的格式对插件进行声明,之后我们就可以在应用程序中使用QPluginLoader 来动态的加载该插件,从而完成应用程序功能的扩展。由于我们平时主要使用插件来扩展我们自己开发的程序,所以今天主要讲解一下使用Low-Level API开发插件的方式。至于High-Level API 方式,有需要的同学可以自行研读Qt的帮助文档和相关Demo。
想要让Qt编写的应用程序支持插件扩展,需要进行一下步骤:
1.定义一系列的接口,应用程序就是使用这些接口与插件进行功能交互的。(标准c++中没有接口的概念,所以此处的接口指只有纯虚函数的类)。
2.使用 Q_DECLARE_INTERFACE() 宏将这个接口的有关信息告诉Qt的元对象系统。
3.在应用程序中使用QPluginLoader 加载这个插件。
4.使用qobject_cast() 函数检测该插件是否实现了特定的接口。
有了应用程序声明的接口,我们还需要编写我们的插件来真正的实现接口所声明的功能,步骤如下:
1.声明一个插件类,让该类继承QObject 和 应用程序所提供的那个接口。
2.使用Q_INTERFACE() 宏告诉Qt元对象系统这个插件实现了哪些接口。
3.使用Q_PLUGIN_METEDATA() 宏导出这个插件。
4.在.pro 文件的进行相关配置,然后编译该插件。
上面说到使用Low-Level API接口开发插件所用到的几个宏定义,下面我们再来详细的看下每个宏的具体含义。
Q_DECLARE_INTERFACE(ClassName, Identifier):这个宏将一个给定的字符串标识符和ClassName所表示的接口相关联,其中Identifier必须唯一。例如:
#define BrushInterface_iid "org.qt-project.Qt.Examples.PlugAndPaint.BrushInterface"
Q_DECLARE_INTERFACE(BrushInterface, BrushInterface_iid)
这个宏通常直接在接口所在的头文件中使用。还有,如果你的接口声明在了一个名称空间中,那么你要确保这个宏的使用位于名称空间外面。例如:
</