Qt提供了一个类QPluginLoader来加载静态库和动态库,在Qt中,Qt把动态库和静态库都看成是一个插件,使用QPluginLoader来加载和卸载这些库。由于在开发项目的过程中,要开发一套插件系统,就使用了Qt的这套类库。

一 编写插件

编写一个Qt的插件需要以下步骤

1.声明一个插件类,

2.定义一个类,实现这个插件类定义的接口,定义的这个类必须从QObject集成下来。

3.使用Q_INTERFACESQ_INTERFACES()告知Qt的元系统这个接口的存在

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;
};

注意:接口类必须是一个纯虚函数

Q_DECLARE_INTERFACE(FilterInterface,"com.trolltech.PlugAndPaint.BrushInterface/1.0")

为了使得程序在运行时刻可以查询一个插件是否实现了给定的接口,必须使用宏Q_DECLARE_INTERFACE()。他的第一个参数是这个接口的名字,第二个参数是一个确定接口的字符串。方便起见,使用了JAVA包的命名方法。如果后来我们改变接口,必须使用一个新的字符串来确认接口。否则,应用程序可能崩溃,所以包括一个版本号是一个不错的方法。

#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);
};

实现这个接口类。实现接口的这个类必须从QObject派生下来,并且必须实现接口类里定义的虚函数。

 Q_EXPORT_PLUGIN2(PlugExtraFilters,  ExtraFiltersPlugin )
由于应用函数使用main()函数作为入口点,插件必须使用宏Q_EXPORT_PLUGIN2()来指定那个类提供插件。
这一行代码可以出现在实现接口类的.cpp文件的任何一行。其中第一个参数为插件的名称,第二个参数为插件类
二 使用插件
QPluginLoader loader(pluginsDir.absoluteFilePath(fileName));QObject *plugin = loader.instance();if (plugin) {populateMenus(plugin);pluginFileNames += fileName;}
    QPluginLoader类提供了一个函数loader来加载插件的实例,如果动态链接库不是一个插件,或者编译的Qt的版本库不对,返回的
QObject对象的指针为空。】
使用unload函数来卸载插件。
三 .pro文件的编写
TEMPLATE      = libCONFIG       += plugin HEADERS       = extrafiltersplugin.hSOURCES       = extrafiltersplugin.cppTARGET        =  pnp_extrafiltersDESTDIR       = ../../plugandpaint/plugins
TEMPLATE的类型为lib.CONFIG的类型为plugin

在Qt中如何编写插件,加载插件和卸载插件相关推荐

  1. WordPress 插件开发教程:插件加载顺序、创建插件、add_action与do_action

    一.插件加载顺序 1.index.php 2.wp-blog-header.php 3.wp-load.php 4.wp-config.php 5.wp-settings.php 二.创建插件 1.插 ...

  2. 在qt中实现图片的加载

    (走了个弯路.用opencv显示qt图片...可以但没必要) 下面是常见的Qlabel加载图片 检测图片是否可以加载 QString filename = "C:\\Users\\Admin ...

  3. qt中append函数_Qt 加载cern-root库 并调用root类

    cern-root是欧洲核子研究中心CERN开发的基于C++,可与python,R,Fortran等语言进行绑定的数据处理框架.cern-root最初基于Qt开发,在root5之前可通过Qt来开发ro ...

  4. 如何让插件加载到Qt Designer

    本文介绍的是如何让插件加载到Qt Designer,插件是一种遵循一定规范的应用程序接口编写出来的程序,对于Qt Designer不多做介绍了,先看内容吧. 本文介绍的是如何使自定义的插件加载到Qt ...

  5. 自写sonar 插件加载到sonar 服务中的展示信息

    在sonar 服务页面的administer->configuration页面展示每一种语言插件的信息: 上图对应的是自写的语言(configfiles)ConfigFiles插件 上面的信息展 ...

  6. web页面的js中检测浏览器是否加载flash插件,用来确保视频播放器和flash上传的正常运行

    web页面的js中检测浏览器是否加载flash插件,用来确保视频播放器和flash上传的正常运行 <script type="text/javascript" languag ...

  7. Android 插件化原理解析——插件加载机制

    上文 Activity生命周期管理 中我们地完成了『启动没有在AndroidManifest.xml中显式声明的Activity』的任务:通过Hook AMS和拦截ActivityThread中H类对 ...

  8. vscode安装swift插件_使用 Webpack 优化 VS Code 插件加载性能

    Webpack 这一 JS 模块打包神器相信大家都不陌生了.由于 VS Code 插件大部分也都是 JS/TS 代码 + 依赖库的形式,因此也可以使用 Webpack 打包,优化性能. 经过实测,经过 ...

  9. 情迁红包配合情迁QQ机器人新版作为插件加载的使用教程

    初次体验 如果你第一次打开本文章,我想对你说的是,这文章可能只供参考因为有些设置又了很大的改动,以及方式也不一样了. 插件开发具体还请参考 手机端编写LUA脚本插件https://www.jiansh ...

  10. ueditor上传图片回调_(常见解决方法)UEditor报错“后端配置项没有正常加载,上传插件不能正常使用”...

    (常见解决方法)UEditor报错"后端配置项没有正常加载,上传插件不能正常使用"_向来萧瑟也无畏-CSDN博客​blog.csdn.net 报错信息 详见此文的"排错过 ...

最新文章

  1. Oracle 10g 应用补丁PSU 10.2.0.5.180717
  2. android 常驻进程
  3. 华东政法大学教学管理系统_中国科学技术大学1022万采购3包生命科学仪器
  4. 新手坐高铁怎么找车厢_一个新手怎么做直播卖衣服?找对货源供应商成功一半...
  5. mpi4py安装报错error: Cannot compile MPI programs. Check your configuration!!!
  6. U8 13.0 - 查询报表慢,程序未响应
  7. 每周一磁 · 磁性材料的居里温度与工作温度
  8. python身份证号处理代码_Python实现身份证号码解析
  9. 单片机常用外设驱动电路
  10. STM32 DHT11
  11. excel模板报表转PDF下载
  12. CSP 202112-1 序列查询 python
  13. mysql删除重复记录语句
  14. 电路实验——实验三 叠加原理
  15. 网络视频直播系统的发展历程
  16. EasyCVR视频广场可以播放WebRTC,设备中却无法播放是什么原因?
  17. php h5微信支付和app微信支付区别,关于微信公众号支付 微信H5支付和微信APP支付的问题 (PHP)TP+VUE...
  18. 华天PDM打通济南重工信息化的“任督二脉”,新动能推动新发展
  19. 在线视频教育课程网站搭建模板
  20. 怎么学习机械学习相关的技术?

热门文章

  1. python 数据分析课程改革网_计算思维培养视域下《Python程序设计》课程的教学改革实践...
  2. 销售词汇Sell In、Sell Through、Sell Out辨析
  3. 基于电位器式传感器位移测量仪的设计
  4. AIZOO开源人脸口罩检测
  5. 2021.12.11LeetCode每日一题——在线选举
  6. 跟着廖雪峰学python 001
  7. uni-app上传图片前压缩
  8. 影视明星杨幂写真合集:时尚优雅、气质迷人!
  9. Tensorflow Allocation Memory: Allocation of 38535168 exceeds 10% of system memory解决办法
  10. 2.3将英尺转换为米