Qt中如何 编写插件 加载插件 卸载插件
Qt中如何 编写插件 加载插件 卸载插件是本文要介绍的内容。Qt提供了一个类QPluginLoader来加载静态库和动态库,在Qt中,Qt把动态库和静态库都看成是一个插件,使用QPluginLoader来加载和卸载这些库。由于在开发项目的过程中,要开发一套插件系统,就使用了Qt的这套类库。
一 编写插件
编写一个Qt的插件需要以下步骤
1.声明一个插件类,
2.定义一个类,实现这个插件类定义的接口,定义的这个类必须从QObject集成下来。
3.使用Q_INTERFACESQ_INTERFACES()告知Qt的元系统这个接口的存在
3.使用宏Q_EXPORT_PLUGIN2()来导出插件的接口
4.编写插件类的.pro文件
下面是一个插件的例子

1.class FilterInterface
2.{
3.public:
4. virtual ~FilterInterface() {}
5.
6. virtual QStringList filters() const = 0;
7. virtual QImage filterImage(const QString &filter, const QImage &image,
8. QWidget *parent) = 0;
9.};

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

1 #include <QObject>
2 #include <QStringList>
3 #include <QImage>
4
5 #include <plugandpaint/interfaces.h>
6
7 class ExtraFiltersPlugin : public QObject, public FilterInterface
8 {
9 Q_OBJECT
10 Q_INTERFACES(FilterInterface)
11
12 public:
13 QStringList filters() const;
14 QImage filterImage(const QString &filter, const QImage &image,
15 QWidget *parent);
16 };

实现这个接口类。实现接口的这个类必须从QObject派生下来,并且必须实现接口类里定义的虚函数。
Q_EXPORT_PLUGIN2(PlugExtraFilters, ExtraFiltersPlugin )由于应用函数使用main()函数作为入口点,插件必须使用宏Q_EXPORT_PLUGIN2()来指定那个类提供插件。
这一行代码可以出现在实现接口类的.cpp文件的任何一行。其中第一个参数为插件的名称,第二个参数为插件类
二 使用插件
1 QPluginLoader loader(pluginsDir.absoluteFilePath(fileName));
2 QObject *plugin = loader.instance();
3 if (plugin) {
4 populateMenus(plugin);
5 pluginFileNames += fileName;
6 }
QPluginLoader类提供了一个函数loader来加载插件的实例,如果动态链接库不是一个插件,或者编译的Qt的版本库不对,返回的QObject对象的指针为空。使用unload函数来卸载插件。
三 .pro文件的编写
1 TEMPLATE= lib
2 CONFIG += plugin
3 HEADERS= extrafiltersplugin.h
4 SOURCES= extrafiltersplugin.cpp
5 TARGET = pnp_extrafilters
6 DESTDIR= http://www.cnblogs.com/plugandpaint/plugins TEMPLATE的类型为lib.CONFIG的类型为plugin
http://www.cnblogs.com/elect-fans/archive/2012/03/20/2408564.html
Qt中如何 编写插件 加载插件 卸载插件的更多相关文章
- 在Qt中如何编写插件,加载插件和卸载插件(转)
Qt提供了一个类QPluginLoader来加载静态库和动态库,在Qt中,Qt把动态库和静态库都看成是一个插件,使用QPluginLoader来加载和卸载这些库.由于在开发项目的过程中,要开发一套插件 ...
- 集成iscroll 下拉加载更多 jquery插件
一个插件总是经过了数月的沉淀,不断的改进而成的.最初只是为了做个向下滚动,自动加载的插件.随着需求和功能的改进,才有了今天的这个稍算完整的插件. 一.插件主功能: 1.下拉加载 2.页面滚动到底部自动 ...
- 基于.NET MVC的高性能IOC插件化架构(二)之插件加载原理
上一篇博文简单介绍了下插件化的代码组成部分:http://www.cnblogs.com/gengzhe/p/4390932.html,源码地址:https://github.com/luohuazh ...
- 纸壳CMS的插件加载机制
纸壳CMS是一个开源的可视化设计CMS,通过拖拽,在线编辑的方式来创建网站. GitHub https://github.com/SeriaWei/ZKEACMS.Core 欢迎Star,Fork,发 ...
- 基于jQuery的图片加载loading效果插件
基于jQuery的图片加载loading效果插件 图片loading的效果是网页中比较常见的,尤其是对大图片,loading效果让用户能够明白图片加载的过程. 实现思路也是比较简单的: $.fn.Lo ...
- Blender插件加载研究
目标 [x] 解析Blender插件代码加载原理, 为测试做准备 结论 采用方法3的方式, 可以在测试中保证重新加载子模块, 是想要的方式, 代码如下: _qk_locals = locals() d ...
- Bootstrap 按钮(Button)插件加载状态
通过按钮(Button)插件,您可以添加进一些交互.比如控制按钮的状态.或者为其它组件(工具栏)创建按钮组. 加载状态 如需向按钮添加加载状态,只需要简单地向 button 元素添加 data-loa ...
- 集成百度编辑器 ueditor 后端配置项没有正常加载,上传插件不能正常使用!
项目要用到编辑器,于是集成了ueditor,集成ok,但一直显示 ‘’后端配置项没有正常加载,上传插件不能正常使用!‘’ 各种查: 网上说的无非就是那么集中情况 1. 因为百度官方的问题,php/co ...
- 非常郁闷的 .NET中程序集的动态加载
记载这篇文章的原因是我自己遇到了动态加载程序集的问题,而困扰了一天之久. 最终看到了这篇博客:http://www.cnblogs.com/brucebi/archive/2013/05/22/Ass ...
随机推荐
- linux修改文件权限
ubuntu 下修改文件访问权限 Ubuntu下修改目录权限命令如下: chmod 600 name (只有所有者有读和写的权限) chmod 644 name (所有者有读和写的权限,组用户只有读的 ...
- [Ubuntu]在Ubuntu下搭建自己的源服务器
1.摘要 网上有很很多关于搭建源镜像的文章,但是对于一般人来讲,用不着镜像所有的deb包,只对我们能用到的感兴趣.另外,对于一些在Ubuntu的源中没有的软件,我们也可以放在我们自己的源里,这 ...
- Eclipse设置分级折叠显示项目工程路径
1.抛出问题现象 如下图,这种方式看项目中的代码简直痛苦的要死: 项目迭代越多,工程目录越庞大,可读性就越差. 2.设置分级折叠显示项目 第一步:在Package Explorer视图中找到它的缩放菜 ...
- hdu4393 Throw nails(只用模拟前面500来次,后面根据速度、位置、id值排序即可)
...
- hdu 2896 病毒侵袭_ac自动机
题意:略 思路:套用ac自动机模板 #include <iostream> #include<cstdio> #include<cstring> using nam ...
- 【转】100行代码实现最简单的基于FFMPEG+SDL的视频播放器
FFMPEG工程浩大,可以参考的书籍又不是很多,因此很多刚学习FFMPEG的人常常感觉到无从下手.我刚接触FFMPEG的时候也感觉不知从何学起. 因此我把自己做项目过程中实现的一个非常简单的视频播放器 ...
- cenos 7 安装php7
1. CentOS/RHEL 7.x: rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm ...
- category和extensions
catgory 允许你为一个已经存在的类增加方法,而不需要增加一个子类.而且不需要知道它内部具体的实现. 另外,虽然Category不能够为类添加新的成员变量,但是Category包含类的所有成员变量 ...
- [Android4.4.3] Nubia Z5S Mokee4.4.3 RC2.0 by syhost
这个ROM先前在Mokee官网公布过,但一些人測试bug不少,因此已经撤下, 但又有人反馈跟之前RC1.0版的bug差点儿相同, 所以再次在网盘单独公布, 截图以及注意事项见之前的RC1.0的帖子, ...
- Babel6.x 转换ES6
本文介绍Babel6.x的安装过程~ 首先呢,可以使用Babel在线转换 https://babeljs.io/repl/ 然后进入主题:安装Babel(命令行环境,针对Babel6.x版本) 1.首 ...