深度解析 Qt 中动态链接库
本文介绍的是Qt 中动态链接库,现在有些软件有自动升级功能,有些就是下载新的DLL文件,替换原来的动态链
接库,MFC好象也有类似机制,Qt还有一种方式,就是把一个QWidget子类,编译成动态链接库.然后根据动态链接库
创建一个对象,返回QWidget子针,如果你的类不是QWidget的子类,就不能用这种方法了。
QLibrary也是用来加载动态链接库,但它创建出来返回的是某个"方法的指针"(不需要头文件),而QPluginLoader
创建返回的是"对象的指针"(对象中有哪些方法可调用,就要头文件说了,所以上面的例子中,需要提供一个接口头文件)
昨天一个同事说要把一个类做成DLL的形式,但这个类不是从QWidget继承。 研究了一下,发现Qt提供了一
个类QPluginLoader可以加载动态链接库。能把一个普通的类编译生成DLL,通过QPluginLoader使用它。
写一个例子说明吧:
工程A中,使用了这样一个类,专门用来让算所得税;
- Tax.h
- class Tax
- {
- float incomeTax(int income);
- };
- Tax.cpp
- Tax::incomeTax(int income)
- {
- float res=(income-1600)*0.5;
- return res;
- }
- main.cpp
- Int main()
- {
- Tax taxobject;
- taxObject. incomeTax(2200);
- ............
- }
编译后部署到机器上.
如果计税方式变了,则incomeTax()必须改写了;
- Tax::incomeTax(int income)
- {
- float res=(income-2000)*0.3;
- return res;
- }
头文件没有变,只是修改了计税方式,工程A必须重新编译,然后重新部署; 如果工程A很大或部署的机器很多,
代价就大了.
如果让Tax类,单独编译成动态链接库,再把Tax中的要被使用的接口写在另一个头文件中,供工程A使用;每
次计税方式变了,只需修改Tax类,然后重新编译生成动态链接库,然后替换工程A中的相应的动态链接库.而工程
A不用重新编译即可使用新的计税方式.
新建一工程B,专门用来把Tax类做成动态链接库的形式:
- //首先定义接口(只要一个头文件即可)
- Tax.h
- class Tax
- {
- virtual float incomeTax(int income);
- };
- QT_BEGIN_NAMESPACE
- Q_DECLARE_INTERFACE(Tax,"TaxDLL/1.0"); //这个宏用声明接口
- QT_END_NAMESPACE
然后从写一个具体业务类,继承上面的接口和QObject,实现接口中定义的方法
- TaxPlugin.h
- class TaxPlugin:public QObject,Tax
- {
- Q_OBJECT
- Q_INTERFACES(Tax)
- public:
- float incomeTax(int income);
- };
- TaxPlugin.cpp
- TaxPlugin::incomeTax(int income)
- {
- float res=(income-1600)*0.5;
- return res;
- }
- Q_EXPORT_PLUGIN2(Tax, TaxPlugin); //这个宏用来导出动态链接库
编译工程B,生成Tax.dll.
把工程Tax.dll和头文件Tax.h,拷到工程A中,供工程A使用.
工程A中
- int main()
- {
- Tax *taxObject;
- QPluginLoader pluginLoader("Tax.dll");
- QObject *plugin = pluginLoader.instance();
- taxObject= qobject_cast<Tax *>(plugin);
- taxObject->incomeTax(2100);
- }
编译即可使用新的计税方式.
QWidget子针,如果你的类不是QWidget的子类,就不能用这种方法了
创建返回的是"对象的指针"(对象中有哪些方法可调用,就要头文件说了,所以上面的例子中,需要提供一个接口头文件)
动态
最新文章
- Asp.net Mvc模块化开发之“开启模块开发、调试的简单愉快之旅”
- 网络流-最大流问题 ISAP 算法解释(转自Renfei Song&#39;s Blog)
- hbase 问题记录
- cocos2d-x lua 触摸事件
- Cocos中的观察者设计模式与通知机制
- Oracle PL/SQL 找出100以内是3和5的倍数的数 循环语句
- 服务器部署_centos 安装jdk手记
- 【Quick-COCOS2D-X 3.3 怎样绑定自己定义类至Lua之三】动手绑定自己定义类至Lua
- 数据结构读书笔记(二)(C语言)
- 转 sqlplus执行sql报错:ORA-01756:
- 【Scala】Scala之Packaging and Imports
- 一张图搞懂容器所有操作 - 每天5分钟玩转 Docker 容器技术(26)
- 【IDEA】向IntelliJ IDEA创建的项目导入Jar包的两种方式
- php面试之数据结构和算法
- AC Dream1069
- 用原生JS从零到一实现Redux架构
- P1822 魔法指纹
- day 06
- angular2 pipe实现搜索结果中的搜索关键字高亮
- Python常用模块time &; datetime &;random 模块
热门文章
- Javascript的学习清单
- react快速上手二(使用JSX语法)
- 【Git】二、文件的提交与查看
- Win10系统升级更新方式将会更智能
- Oracle笔记(十六) 数据库设计范式
- Linux特殊权限及ACL权限
- web开发:Bootstrap
- 5.caffe:train.sh 和 test.sh (训练与测试 )
- 06—mybatis缓存机制
- Educational Codeforces Round 73 (Rated for Div. 2) D. Make The Fence Great Again(DP)