如何创建Qt插件
https://doc.qt.io/qt-5/plugins-howto.html
Qt提供了两个用于创建插件的API:
- 用于编写Qt自身扩展的高级API:自定义数据库驱动程序,图像格式,文本编解码器,自定义样式等。
- 用于扩展Qt应用程序的低级API。
高级API:编写Qt扩展
编写扩展Qt本身的插件是通过对相应的插件基类进行子类化,实现一些功能以及添加宏来实现的。
低级API:扩展Qt应用程序
通过插件不仅可以扩展Qt本身,而且可以扩展Qt应用程序。这要求应用程序使用QPluginLoader检测和加载插件。在这种情况下,插件可以提供任意功能,并且不仅限于数据库驱动程序,图像格式,文本编解码器,样式以及扩展Qt功能的其他类型的插件。
通过插件使应用程序可扩展涉及以下步骤:
- 定义一组用于与插件对话的接口(仅具有纯虚函数的类)。
- 使用Q_DECLARE_INTERFACE()宏告诉Qt的元对象系统有关接口的信息。
- 在应用程序中使用QPluginLoader加载插件。
- 使用qobject_cast()测试插件是否实现了给定的接口。
编写插件涉及以下步骤:
- 声明一个继承自QObject和该插件要提供的接口的插件类。
- 使用Q_INTERFACES()宏告诉Qt的元对象系统有关接口的信息。
- 使用Q_PLUGIN_METADATA()宏导出插件。
- 使用合适的
.pro
文件构建插件。
定位插件
Qt应用程序自动知道哪些插件可用,因为插件存储在标准插件子目录中。由于此应用程序不需要任何代码来查找和加载插件,因为Qt会自动处理它们。
在开发过程中,插件目录是QTDIR/plugins
(QTDIR
Qt的安装目录在哪里),每种类型的插件都在该类型的子目录中,例如styles
。如果您希望应用程序使用插件,而又不想使用标准插件路径,请让安装过程确定要用于插件的路径,然后保存该路径,例如,使用QSettings来保存。运行时读取的应用程序。然后,应用程序可以使用此路径调用QCoreApplication :: addLibraryPath(),并且您的插件将对应用程序可用。请注意,路径的最后部分(例如styles
)无法更改。
如果您希望插件可加载,则一种方法是在应用程序下创建一个子目录,并将插件放置在该目录中。如果分发Qt随附的任何插件(位于plugins
目录中),则必须将plugins
插件所在的子目录复制到应用程序的根文件夹(即,不包括plugins
目录)。
静态插件
将插件包含在应用程序中的最普通,最灵活的方法是将其编译为单独提供的动态库,并在运行时进行检测和加载。
插件可以静态链接到您的应用程序。如果您构建静态版本的Qt,则这是包括Qt的预定义插件的唯一选项。使用静态插件使部署不太容易出错,但是缺点是,如果不完全重建和重新分发应用程序,则无法添加插件的功能。
要静态链接插件,您需要使用将必需的插件添加到构建中QTPLUGIN
。