QT之插件得使用

Qt 插件for C++

Qt中为我们提供了两种开发插件的方式。一种是使用High-Level API接口,一种是使用Low-Level API接口。
所谓High-Level API 是指通过继承Qt为我们提供的特定的插件基类,然后实现一些虚函数、添加需要的宏即可。该种插件开发方式主要是用来扩展Qt库本身的功能,比如自定义数据库驱动、图片格式、文本编码、自定义样式等。
而我们为自己的应用程序编写插件来扩展其功能时主要使用第二种方式,即Low-Level API 的方式,该方式不仅能扩展我们自己的应用程序,同样也能像High-Level API 那样用来扩展Qt本身的功能。使用这种方式,我们可以将我们需要扩展的功能写成一个 接口,然后让一个插件类去实现这个接口的功能,再使用Qt提供的用于插件开发的宏,按Qt要求的格式对插件进行声明,之后我们就可以在应用程序中使用QPluginLoader 来动态的加载该插件,从而完成应用程序功能的扩展。由于我们平时主要使用插件来扩展我们自己开发的程序,所以今天主要讲解一下使用Low-Level API开发插件的方式。至于High-Level API 方式,有需要的同学可以自行研读Qt的帮助文档和相关Demo。
想要让Qt编写的应用程序支持插件扩展,需要进行一下步骤:

   1.定义一系列的接口,应用程序就是使用这些接口与插件进行功能交互的。(标准c++中没有接口的概念,所以此处的接口指只有纯虚函数的类)。

   2.使用 Q_DECLARE_INTERFACE() 宏将这个接口的有关信息告诉Qt的元对象系统。

   3.在应用程序中使用QPluginLoader 加载这个插件。

   4.使用qobject_cast() 函数检测该插件是否实现了特定的接口。

   有了应用程序声明的接口,我们还需要编写我们的插件来真正的实现接口所声明的功能,步骤如下:

   1.声明一个插件类,让该类继承QObject 和 应用程序所提供的那个接口。

   2.使用Q_INTERFACE() 宏告诉Qt元对象系统这个插件实现了哪些接口。

   3.使用Q_PLUGIN_METEDATA() 宏导出这个插件。

   4.在.pro 文件的进行相关配置,然后编译该插件。

   上面说到使用Low-Level API接口开发插件所用到的几个宏定义,下面我们再来详细的看下每个宏的具体含义。

    Q_DECLARE_INTERFACE(ClassName, Identifier):这个宏将一个给定的字符串标识符和ClassName所表示的接口相关联,其中Identifier必须唯一。例如:
#define BrushInterface_iid "org.qt-project.Qt.Examples.PlugAndPaint.BrushInterface"

Q_DECLARE_INTERFACE(BrushInterface, BrushInterface_iid)
这个宏通常直接在接口所在的头文件中使用。还有,如果你的接口声明在了一个名称空间中,那么你要确保这个宏的使用位于名称空间外面。例如:

namespace Foo
{
   
struct MyInterface {
    ... };
}

Q_DECLARE_INTERFACE(Foo::MyInterface, “org.examples.MyInterface”)
Q_IMPORT_PLUGIN(PluginName): 这个宏向应用程序中导入名字为PluginName的插件,这个名字对应于Q_PLUGIN_METADATA() 所在类的类名。这个宏主要用来导入静态插件。
Q_PLUGIN_METADATA(IID … FILE …) :这个宏用来声明插件的元数据信息。需要传入被实现接口的IID,和一个保护该插件元数据信息的json文件。注意,这个宏所在的class必须是可默认构造的;另外,FILE是可选的,若传入了一个json文件,则要确保编译系统能找到这个的文件,不然,moc(meta-object compiler) 会因为找不到该文件而失败退出。
方法总结: 一个项目需要调用写好得插件,
法1:该项目得.h文件中声明好调用插件得接口,这些接口都是虚函数,需要在插件中实现。插件中通过继承实现接口得方式对接口实现,项目中加载DLL使用。
法2:写一个基类,将其编译为DLL文件,插件调用基类DLL并实现其中需要实现得函数编译为DLL文件,主项目调用该插件。

例子1:动态插件得法一

先建一个测试项目MytestPro,然后在工程中添加一个头文件,该头文件就是工程使用得接口ÿ

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值