目录

官方解析

博主栗子


官方解析

Qt应用程序可以对插件进行扩展,要使用QPluginLoader这个类进行加载。插件可以提供任意的功能,而且不限制数据库驱动,图像格式,以及其他的Qt功能插件。

当调用插件时要有如下的过程:

1. 定义一个抽象类作为接口,用于调用插件;

2. 使用Q_DECLARE_INTERFACE()宏告诉Qt元对象系统,这是一个接口类;

3. 使用QPluginLoader加载插件;

4. 使用qobject_cast去尝试把插件实例转换为 接口。

写插件包含的过程:

1. 写一个插件类,这个类继承了QObject和调用插件时写的那个接口类;

2. 使用Q_INTERFACES()宏告诉元对象,这个哪个类是接口;

3. 使用Q_EXPORT_PLUGIN2()宏用于导出插件;

4. 配置好.pro文件。

下面是一个接口类的代码:

 class FilterInterface{public:virtual ~FilterInterface() {}virtual QStringList filters() const = 0;virtual QImage filterImage(const QString &filter, const QImage &image,QWidget *parent) = 0;};

下面是插件类的代码:

 #include <QObject>#include <QStringList>#include <QImage>#include <plugandpaint/interfaces.h>class ExtraFiltersPlugin : public QObject, public FilterInterface{Q_OBJECTQ_INTERFACES(FilterInterface)public:QStringList filters() const;QImage filterImage(const QString &filter, const QImage &image,QWidget *parent);};

博主栗子

下面举一个插件生成和调用的例子,程序运行截图如下:

调用插件端:

当点击Test后,调用插件界面:

插件端源码如下:

AppInterface.h

#ifndef APPINTERFACE_H
#define APPINTERFACE_H#include <QtPlugin>class AppInterface{public:virtual ~AppInterface(){}virtual QString pluginName() const = 0;virtual QWidget *createWidget() = 0;
};Q_DECLARE_INTERFACE(AppInterface, "com.AppInterface");#endif //APPINTERFACE_H

HelloWidget.h

#ifndef HELLOWIDGET_H
#define HELLOWIDGET_H#include <QObject>
#include "AppInterface.h"class HelloWidget: public QObject, public AppInterface{Q_OBJECTQ_INTERFACES(AppInterface)public:HelloWidget();~HelloWidget();QString pluginName() const;QWidget *createWidget();
};#endif

HelloWidget.cpp

#include "HelloWidget.h"
#include "MyWidget.h"HelloWidget::HelloWidget(){}HelloWidget::~HelloWidget(){}QString HelloWidget::pluginName() const{return "Plugin";
}QWidget *HelloWidget::createWidget(){return new MyWidget;
}           Q_EXPORT_PLUGIN2("helloWidget", HelloWidget);

MyWidget.h

#ifndef MYWIDGET_H
#define MYWIDGET_H#include <QWidget>class MyWidget : public QWidget{Q_OBJECTpublic:MyWidget(QWidget *parent = 0);~MyWidget();
};#endif

MyWidget.cpp

#include "MyWidget.h"
#include <QPushButton>
#include <QVBoxLayout>MyWidget::MyWidget(QWidget *parent): QWidget(parent){QPushButton *button = new QPushButton("Test Button");QVBoxLayout *layout = new QVBoxLayout;layout->addWidget(button);setLayout(layout);}MyWidget::~MyWidget(){}

MyWidget.pro

TARGET = HelloWidget
TEMPLATE = lib
CONFIG += pluginSOURCES += \MyWidget.cpp\HelloWidget.cppHEADERS += \AppInterface.h\HelloWidget.h\MyWidget.h

插件调用端:

AppInterface.h

#ifndef APPINTERFACE_H
#define APPINTERFACE_H#include <QtPlugin>class AppInterface{public:virtual ~AppInterface(){}virtual QString pluginName() const = 0;virtual QWidget *createWidget() = 0;
};Q_DECLARE_INTERFACE(AppInterface, "com.AppInterface");#endif //APPINTERFACE_H

Widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>class Widget : public QWidget{Q_OBJECTpublic:Widget(QWidget *parent = 0);~Widget();protected slots:void btnClicked();};#endif  //WIDGET_H

Widget.cpp

#include <QDir>
#include <QApplication>
#include <QPluginLoader>
#include <QDebug>Widget::Widget(QWidget *parent) : QWidget(parent){QPushButton *button = new QPushButton("Test");QVBoxLayout *layout = new QVBoxLayout;layout->addWidget(button);setLayout(layout);connect(button, SIGNAL(clicked()), this, SLOT(btnClicked()));
}Widget::~Widget(){}void Widget::btnClicked(){//QMessageBox::information(this, "tip", "HelloWidget");QDir pluginsDir(qApp->applicationDirPath() + "/Plugin");foreach(QString fileName, pluginsDir.entryList(QDir::Files)){QPluginLoader pluginLoader(pluginsDir.absoluteFilePath(fileName));QObject *plugin = pluginLoader.instance();if(plugin){qDebug() << plugin;AppInterface *app = qobject_cast<AppInterface*>(plugin);if(app){QWidget *widget = qobject_cast<QWidget*>(app->createWidget());widget->show();}}else{QMessageBox::information(this, "tip", "load plugin error");}}}

main.cpp

#include "Widget.h"
#include <QApplication>int main(int argc, char *argv[]){QApplication a(argc, argv);Widget w;w.show();return a.exec();
}

CallPlugin.pro

QT += core guiTARGET = CallPlugin
TEMPLATE = appSOURCES += Widget.cpp\main.cppHEADERS += Widget.h\AppInterface.h

Qt文档阅读笔记-Qt4 Lower-Level API扩展Qt Applications(Qt4中Plugin的使用)解析与实例相关推荐

  1. Qt文档阅读笔记-Visual Parent的初步理解(获取QML中的根节点及其子结点)

    Qt有个继承树 在Widgets里面,可以通过setParent加进去! 搞QML的都知道QQmlContext继承于QObject 辣么问题在C++和QML交换的时候! 能不能通过QQmlConte ...

  2. Qt文档阅读笔记-共享库的创建与调用

    使用共享库的符号 这个符号可以作用在变量.类.函数中,并且这些都可以被调用端使用. 在编译共享库中,需要使用export符号.在使用端调用的时候使用import符号. 这里是本人从文档中记录的笔记,大 ...

  3. Qt文档阅读笔记-加载HeightMap(高度图)构造3D地形图

    Qt文档阅读笔记-加载HeightMap(高度图)构造3D地形图 QHeightMapSurfaceDataProxy:是Q3DSurface的一个基本代理类. 他是专门加载高度图. 高度图是没有X, ...

  4. Qt文档阅读笔记-Rotations Example相关

    Rotations Example文档阅读笔记 使用这种方式,对y轴和z轴进行旋转. QQuaternion yRotation = QQuaternion::fromAxisAndAngle(0.0 ...

  5. Qt文档阅读笔记-QWebEngineView及QML WebEngineView

    这里主要是最近有给Java Web项目及Qt项目需要混合,自己搞的QtWebEngine没有问题,而用了项目里面的,就有问题,在此阅读下官方资料,看看能不能解决这样莫名其妙的问题,在此记录下本次的阅读 ...

  6. Qt文档阅读笔记-moc工具使用及其理论(moc工具如何添加到makefile中)

    moc(Meta-Object Compiler):用于处理Qt中关于C++的扩展. moc工具读取C++头文件,看看这个头文件里面的类是不是包含Q_OBJECT宏,它会将这个头文件,转换为带有met ...

  7. Qt文档阅读笔记-Fortune Client Example实例解析

    目录 官方解析 实例代码 博主增加解析 官方解析 Fortune Client Example 以使用QTcpSocket为例子,服务端可以配合Fortune Server或Threaded Fort ...

  8. Qt文档阅读笔记-对Style Plugin Example实例的解析

    目录 前言 Style Plugin Example SimpleStylePlugin Class 定义 SimpleStylePlugin Class 实现 main()函数 The Simple ...

  9. Qt文档阅读笔记-QSet官方解析及实例

    目录 官方解析 博主栗子 官方解析 QSet类是一个模板类,他是一个哈希表集合. QSet<T>是Qt的一个普通容器类.QSet存储的值是不指明顺序的,QSet对这些值提供了快速检索的功能 ...

  10. Qt文档阅读笔记-QML Canvas的官方解析及实例

    目录 官方解析 博主例子 官方解析 Canvas可以用于画直线或曲线,简单或复杂的形状,图形,图片,并且他能加文字,颜色,阴影,和颜色梯度,和其他的装饰,可以进行低像素操作.Canvas可以保存成图像 ...

最新文章

  1. 软件工程实践第一次作业
  2. Jquery插件使用 焦点图插件 MyFocus ,另外记录一款插件 KinMaxShow大背景图插件。...
  3. 利用 Cosole 来学习、调试JavaScrip
  4. C语言 数组排序 – 选择法排序 - C语言零基础入门教程
  5. 阶乘之和计算_浅谈积分计算的技巧
  6. 导出mysql某个表数据_MYSQL使用mysqldump导出某个表的部分数据
  7. 3h精通OpenCV(四)-绘制形状与文本
  8. C# 实现自定义的USB设备与上位机进行通信(上位机部分)
  9. 2018Oracle11g下载与安装菜鸟教程(一)
  10. 最新柒上网络小说漫画系统双模板源码V4.0+TP内核
  11. 第十二课:OpenGL扩展
  12. Unity2021.2.0版本汉化
  13. 软件测试初学者学习资料汇总大全(校招、工作进阶通用)
  14. 莫名其妙的解决了MagicDraw中文问题
  15. 测试内存条是否兼容软件,内存条不兼容有什么表现
  16. 配对碱基链(C语言)
  17. 2020年最好用的手机是哪一款_2020年什么手机好用,买手机建议买什么牌子的?...
  18. markdown的基本使用方法 1
  19. 如何解决非标自动化设备制造企业管理难题?ERP管理系统推荐
  20. 【20212121】Python基础 05条件控制语句

热门文章

  1. Linux网络编程:原始套接字的魔力【续】
  2. MySql数据同步(双机热备)已正式应用上平台
  3. [转载]《不要一辈子靠技术生存》
  4. 做一个程序员,是不是“努力就会成功”?现实残酷但又必须面对!
  5. ERP火了20年,“中台”仅用5年就消失了?
  6. 淮安掼蛋网页版-源码头文件总结
  7. 微软对键盘上的Page Up Page Down按钮享有专利权
  8. Intel:Larrabee浮点运算能力2TFlops
  9. 神话与谬误:争论C++前你应当知道什么
  10. C/C++基础语法,赶紧收藏好哟~