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这能确保插件兼容应用程序中所用的库版本。
相关文章推荐
- Qt5的插件机制(6)--开发Qt插件时几个重要的宏
- Qt键盘驱动处理类的实现:Qt键盘驱动处理类的实现,通过Qt的插件机制实现嵌入式开发中的自定义键盘处理。
- qt 插件机制
- Qt插件机制的学习
- Qt5的插件机制(1)--Qt 框架中的插件加载机制概述
- Qt5的插件机制(4)--Qt插件的元信息metaData
- Qt插件机制的学习
- Qt5的插件机制(2)--QxxxFactory类与QFactoryLoader类
- Qt5的插件机制(6)--开发Qt插件时几个重要的宏
- QT插件机制
- Qt的插件机制(转)
- Qt 插件机制以及插件中几个重要的宏
- Qt的插件机制
- QT的插件机制在程序发布时易出现的问题
- Qt的插件机制
- QT跟VC++结合来进行插件的验证机制
- Qt插件机制的学习
- Qt 插件综合编程-基于插件的OpenStreetMap瓦片查看器客户端(3) 插件管理机制
- QT插件机制
- Qt的插件机制