春衣少年当酒歌,起舞四顾以笑和。这篇文章主要讲述Qt开发技术:Qt的动态静态插件框架介绍和Demo相关的知识,希望能为你提供帮助。
前言Qt的插件化开发框架类似于前后端的微服务的场景,授权哪个微服务则前端可以使用哪个微服务,作为进一步的货站,软件中也可以先出现图标,点击后进行动态加载,减少软件的部署大小同时更重要的是增加了程序的灵活性。
创建Qt插件Qt提供了两个用于创建插件的API:
- 编写Qt扩展的高级API:自定义数据库驱动程序、图像格式、文本编解码器、自定义样式等;
- 用于扩展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开发技术(Qt的动态静态插件框架介绍和Demo)】 | 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 | 不区分 |
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推荐阅读
- web前端期末大作业 html+css+javascript 校园主题网页设计(南京大学3页)个人毕设专用
- innobackup全备
- Qt实用技巧(使用QMediaPlayer播放mp4文件)
- Python反爬,JS反爬串讲,从MAOX眼X开始,本文优先解决反爬参数 signKey
- Qt实用技巧(将QWidget作为输入窗口,接收键盘消息输入法并且控制输入法悬浮工具栏位置控制)
- 打开雨林木风XP系统无线网络服务的办法 - 雨林木风Win10系统下载官网
- 中关村XP系统无法安装.Net Framework 4.5的处理办法 - 雨林木风Win10系统下载官网
- 合并技术员联盟W10系统中的多个iexplorer.exe - 雨林木风Win10系统下载官网
- 访问网络时雨林木风XP系统提示没有权限运用网络资源的处理办法 - 雨林木风Win10系统下载官网