您的位置:首页 > 编程语言 > Qt开发

Qt的插件机制

2017-09-22 20:48 281 查看

1.前言

插件是一种遵循一定规范的应用程序接口编写出来的程序。很多软件都有插件,插件有无数种。例如在IE中,安装相关的插件后,WEB浏览器能够直接调用插件程序,用于处理特定类型的文件。

2.QT插件API

Qt有两种与插件有关的API。一种用来扩展Qt本身的功能,如自定义数据库驱动,图像格式,文本编解码,自定义分格,等等,称为Higher-Level API。另一种用于应用程序的功能扩展,称为Lower-Level API。前一种是建立在后一种的基础之上的。这里讨论的是后一种,即用来扩展应用程序的Lower-level API。

3.应用程序支持插件扩展的步骤

1. 定义一个接口集(只有纯虚函数的类),用来与插件交流。

2. 用宏Q_DECLARE_INTERFACE()将该接口告诉Qt元对象系统。
Q_DECLARE_INTERFACE(BrushInterface,"com.trolltech.PlugAndPaint.BrushInterface/1.0")
3. 应用程序中用QPluginLoader来装载插件。

4. 用宏qobject_cast()来确定一个插件是否实现了接口。
QObject *obj = new QTimer;
QTimer *timer = qobject_cast<QTimer *>(obj);


4.写一个插件的步骤

写一个插件的步骤:

1. 声明插件类,该类从QObject和该插件希望实现的接口继承而来。

2. 用宏Q_INTERFACES()将该接口告诉Qt元对象系统。
class BasicToolsPlugin : public QObject,
public BrushInterface,
public ShapeInterface,
public FilterInterface
{
Q_OBJECT
Q_INTERFACES(BrushInterface ShapeInterface FilterInterface)
public:
...
};
3. 用宏Q_EXPORT_PLUGIN2()导出插件。
Q_EXPORT_PLUGIN2 ( PluginName, ClassName )
4. 用适当的.pro文件构建插件。下面的代码声明了一个接口类:
class FilterInterface
{
public:
virtual ~FilterInterface() {}
virtual QStringList filters() const = 0;
virtual QImage filterImage(const QString &filter, const QImage &image, QWidget* parent)=0;
};
Q_DECLARE_INTERFACE(FilterInterface, "com.trolltech.PlugAndPaint.FilterInterface/1.0")
这里是实现该接口的插件类的定义:
#include <QObject>
#include <QStringList>
#include <QImage>
#include <plugandpaint/interfaces.h>

class ExtraFiltersPlugin : public QObject, public FilterInterface
{
Q_OBJECT
Q_INTERFACES(FilterInterface)

public:
QStringList filters() const;
QImage filterImage(const QString &filter, const QImage &image,
QWidget *parent);
};
示例 Plug & Paint 的文档详细解释了这一过程。与Qt Designer有关的问题请看Creating Custom Widgets for Qt Designer 。 Echo Plugin Example 是一个关于如何实现扩展Qt应用程序的详细示例。

5.装载插件

装载插件时。Qt库有一些健全检查来确定插件能否被装载和使用。这就可以同时安装多个版本和Qt库配置。

与较高主版本和(或)次版本号的Qt库链接的插件不能被主版本和(或)次版本号较低的库装载。

原理: 一个使用新版Qt库的插件可能用了老版本没有的新特征。Trolltech有一个只在次版本号升级时添加新功能和API的政策,这就是为什么该测试只看主次版本号,而不看补丁号。

Qt库和所有插件用一个联编关键字来联编。Qt库中的联编关键字被与插件中的联编关键字对照,如果相符,插件就被装载。如果联编关键字不符,Qt库就拒绝装载该插件。

原理: 见下文对联编关键字的解释。

编译插件来扩展应用程序时,确保插件和应用程序用同样的配置这一点很重要。这意味着如果应用程序是release模式编译的,那么插件也要是release模式。

若将Qt配置为debug和release模式都编译,但只在release模式下编译应用程序,就要确保你的插件也是在release模式下编译的。缺省的,若Qt的debug编译可用,插件就只在debug模式下编译。要强制插件用release模式编译,要在工程中添加:

CONFIG += release这能确保插件兼容应用程序中所用的库版本。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: