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

春衣少年当酒歌,起舞四顾以笑和。这篇文章主要讲述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开发技术(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




不区分


如果有一个名为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

    推荐阅读