Qt开发技术:Qt的动态静态插件框架介绍和Demo

Posted 长沙红胖子

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Qt开发技术:Qt的动态静态插件框架介绍和Demo相关的知识,希望对你有一定的参考价值。




前言

Qt的插件化开发框架类似于前后端的微服务的场景,授权哪个微服务则前端可以使用哪个微服务,作为进一步的货站,软件中也可以先出现图标,点击后进行动态加载,减少软件的部署大小同时更重要的是增加了程序的灵活性。


创建Qt插件

Qt提供了两个用于创建插件的API:

  • 编写Qt扩展的高级API:自定义数据库驱动程序、图像格式、文本编解码器、自定义样式等;
  • 用于扩展Qt应用程序的低级API;

例如,如果您想编写一个定制的QStyle子类并让Qt应用程序动态加载它,那么您将使用更高级别的API。

      由于较高级别的API构建在较低级别的API之上,因此两个API都存在一些共同的问题。

如果您想提供与Qt设计器一起使用的插件,请参阅Qt设计器模块文档

      (注意:此处我们的插件主要有研究动态下载加载)

高级API:编写Qt扩展(这不是我们当前所关注的,可以略过)

编写扩展Qt本身的插件是通过子类化适当的插件基类、实现一些函数和添加宏来实现的。

有几个插件基类。默认情况下,派生插件存储在标准插件目录的子目录中。如果插件没有存储在适当的目录中,Qt将找不到它们。

下表总结了插件基类。有些类是私有的,因此没有文档记录。您可以使用它们,但不能保证与更高版本的Qt兼容。


序号



基类



文件夹名



Qt模块



大小写



1



QAccessibleBridgePlugin



accessiblebridge



Qt GUI



区分



2



QImageIOPlugin



imageformats



Qt GUI



区分



3



QPictureFormatPlugin (obsolete)



pictureformats



Qt GUI



区分



4



QAudiosystemPlugin



audio



Qt Multimedia



不区分



5



QDeclarativeVideoBackendFactoryInterface



video/declarativevideobackend



Qt Multimedia



不区分



6



QGstBufferPoolPlugin



video/bufferpool



Qt Multimedia



不区分



7



QMediaPlaylistIOPlugin



playlistformats



Qt Multimedia



不区分



8



QMediaResourcePolicyPlugin



resourcepolicy



Qt Multimedia



不区分



9



QMediaServiceProviderPlugin



mediaservice



Qt Multimedia



不区分



10



QSGVideoNodeFactoryPlugin



video/videonode



Qt Multimedia



不区分



11



QBearerEnginePlugin



bearer



Qt Network



区分



12



QPlatformInputContextPlugin



platforminputcontexts



Qt Platform

 Abstraction



不区分



13



QPlatformIntegrationPlugin



platforms



Qt Platform

Abstraction



不区分



14



QPlatformThemePlugin



platformthemes



Qt Platform Abstraction



不区分



15



QGeoPositionInfoSourceFactory



position



Qt Positioning



区分



16



QPlatformPrinterSupportPlugin



printsupport



Qt Print

 Support



不区分



17



QSGContextPlugin



scenegraph



Qt Quick



区分



18



QScriptExtensionPlugin



script



Qt Script



区分



19



QSensorGesturePluginInterface



sensorgestures



Qt Sensors



区分



20



QSensorPluginInterface



sensors



Qt Sensors



区分



21



QSqlDriverPlugin



sensors



Qt SQL



区分



22



QIconEnginePlugin



iconengines



Qt SVG



不区分



23



QAccessiblePlugin



accessible



Qt Widgets



区分



24



QStylePlugin



styles



Qt Widgets



不区分


如果有一个名为MyStyle的新样式类要作为插件提供,则该类需要定义如下(MyStyle plugin.h):

class MyStylePlugin : public QStylePlugin

Q_OBJECT
Q_PLUGIN_METADATA(IID \\
"org.qt-project.Qt.QStyleFactoryInterface" \\
FILE
"mystyleplugin.json")
public:
QStyle *create(const QString &key);
;

确保类实现位于.cpp文件中:

#include "mystyleplugin.h"
QStyle *MyStylePlugin::create(const QString &key)

if (key.toLower() == "mystyle")
return new MyStyle;
return 0;

(请注意,QStylePlugin不区分大小写,create()实现中使用了该键的小写版本;大多数其他插件区分大小写。)

此外,大多数插件都需要一个包含描述插件的元数据的json文件(mystyleplugin.json)。对于样式插件,它只包含插件可以创建的样式列表:

json文件中需要提供的信息类型依赖于插件,有关需要包含在文件中的信息的详细信息,请查看具体的类描述。

对于数据库驱动程序、图像格式、文本编解码器和大多数其他插件类型,不需要显式创建对象。Qt将根据需要找到并创建它们。样式是一个例外,因为您可能希望在代码中显式设置样式。要应用样式,请使用以下代码:

QApplication::setStyle(QStyleFactory::create("MyStyle"));

一些插件类需要实现额外的函数。有关必须为每种插件重新实现的虚拟函数的详细信息,请参阅类文档。

样式插件示例演示如何实现扩展QStylePlugin基类的插件。

低级API:扩展Qt应用程序(这是我们需要的)

不仅Qt本身,Qt应用程序也可以通过插件进行扩展。这需要应用程序使用QPluginLoader检测和加载插件。在这种情况下,插件可以提供任意的功能,并且不限于数据库驱动程序、图像格式、文本编码、样式和扩展Qt功能的其他类型的插件。

通过插件使应用程序可扩展包括以下步骤:

  • 步骤一:定义一组用于与插件对话的接口(只有纯虚拟函数的类,在调用插件时就是使用给该接口类实例调用接口);
  • 步骤二:使用Q_DECLARE_INTERFACE()宏告诉Qt的元对象系统有关该接口的信息;
  • 步骤三:在应用程序中,使用QPluginLoader加载插件;
  • 步骤四:使用qobject_cast()测试插件是否实现给定接口;

例如,下面是接口类的定义:

class FilterInterface

public:
virtual ~FilterInterface()

virtual QStringList filters() const = 0;
virtual QImage Qt+ECharts开发笔记:ECharts的动态排序柱状图介绍基础使用和Qt封装Demo

Qt+ECharts开发笔记:ECharts的动态排序柱状图介绍基础使用和Qt封装Demo

Qt+ECharts开发笔记:ECharts的动态排序柱状图介绍基础使用和Qt封装Demo

Qt系列文章之三十七(基于QWidget 创建和使用静态链接库)

Qt系列文章之三十七(基于QWidget 创建和使用静态链接库)

Qt 插件开发 plugin 超详细 有源码四Qt扩展应用程序,插件创建和使用流程