关于插件的概念这里就不再赘述,大家应该对此心知肚明——即便说不出准确的概念,也会知道这个词到底是什么意思。
Qt 插件由共享库(Unix/Linux 上的 .so 以及 Windows 上的 .dll)实现。简单来说,一切关于共享库的知识,在 Qt 插件上同样适用。Qt 插件根本上说就是符合某些规定的共享库。从另外一方面说,插件架构是不同于普通的链接的。我们可以将插件理解成一种动态链接技术,而非插件则是静态链接。
插件系统机制是,核心系统指定接口和交换的数据格式(通常是以 API 的形式给出)。这种接口和特定的数据格式形成一种协议,不同模块通过这种协议与核心系统进行交互,或者是能够通过核心系统将自己的某些功能暴露出来(也就是为其它模块提供服务)。仅仅将所需要的功能放到动态链接库里面并不能满足一些特定的需求,比如,我们希望应用程序能够自动发现某一特定文件夹下的动态链接库,能够知道这些动态链接库内部的逻辑是怎样的,我们能够如何使用它们。这些需求,对于一个普通的动态链接库模块是不能实现的(或者说,不是自动提供的功能,而需要编写额外的代码)。于是,我们需要一个插件架构。一般来说,动态链接库能够对外暴露出的是一系列函数。对于链接库内部的变量、类以及对象则不能直接访问。编写插件则可以绕过这个限制,插件内部的变量、对象都可以直接对应用程序暴露出来。
类似于 Eclipse,你应该有一个约定好的插件目录。如果你做的足够好,那么你可以实现在系统运行时将插件加载进来,并且可能会在菜单中动态添加新的项目,而不需要重新启动应用程序或者运行一个新的可执行文件。
Qt 的插件分为两类:
- 高级 API:用于为 Qt 自己编写插件,例如数据库驱动、图像格式、文本编码、style 等;
- 低级 API:用于为 Qt 应用程序编写功能扩展。
我们本系列文章主要关注的是低级 API,也就是能够扩展我们自己的应用程序的插件。由于高级 API 同样建立在低级 API 基础之上,这里所说的一些事项,同样适用于高级 API。我们可以这么理解:插件就是一系列实现了我们定义好的接口的类;低级 API 要求我们自己去设计这样的接口,而高级 API 则是 Qt 已经定义好了这些接口,要求我们去实现。
我们在下节开始研究如何开发我们自己的插件,用于扩展我们自己的应用程序的功能。
注意,我们这里强调是基于 Qt 4 的插件开发。由于 Qt 5 已经改变了插件的某些开发方式,所以,我们这里提到的部分内容将不适用于 Qt 5。