本文介绍的是Qt 中动态链接库,现在有些软件有自动升级功能,有些就是下载新的DLL文件,替换原来的动态链
接库,MFC好象也有类似机制,Qt还有一种方式,就是把一个QWidget子类,编译成动态链接库.然后根据动态链接库
创建一个对象,返回QWidget子针,如果你的类不是QWidget的子类,就不能用这种方法了。

QLibrary也是用来加载动态链接库,但它创建出来返回的是某个"方法的指针"(不需要头文件),而QPluginLoader
创建返回的是"对象的指针"(对象中有哪些方法可调用,就要头文件说了,所以上面的例子中,需要提供一个接口头文件)

昨天一个同事说要把一个类做成DLL的形式,但这个类不是从QWidget继承。 研究了一下,发现Qt提供了一
个类QPluginLoader可以加载动态链接库。能把一个普通的类编译生成DLL,通过QPluginLoader使用它。

写一个例子说明吧:

工程A中,使用了这样一个类,专门用来让算所得税;

  1. Tax.h
  2. class  Tax
  3. {
  4. float incomeTax(int income);
  5. };
  6. Tax.cpp
  7. Tax::incomeTax(int income)
  8. {
  9. float res=(income-1600)*0.5;
  10. return res;
  11. }
  12. main.cpp
  13. Int main()
  14. {
  15. Tax taxobject;
  16. taxObject. incomeTax(2200);
  17. ............
  18. }

编译后部署到机器上.

如果计税方式变了,则incomeTax()必须改写了;

  1. Tax::incomeTax(int income)
  2. {
  3. float res=(income-2000)*0.3;
  4. return res;
  5. }

头文件没有变,只是修改了计税方式,工程A必须重新编译,然后重新部署; 如果工程A很大或部署的机器很多,
代价就大了.

如果让Tax类,单独编译成动态链接库,再把Tax中的要被使用的接口写在另一个头文件中,供工程A使用;每
次计税方式变了,只需修改Tax类,然后重新编译生成动态链接库,然后替换工程A中的相应的动态链接库.而工程
A不用重新编译即可使用新的计税方式.

新建一工程B,专门用来把Tax类做成动态链接库的形式:

  1. //首先定义接口(只要一个头文件即可)
  2. Tax.h
  3. class Tax
  4. {
  5. virtual float incomeTax(int income);
  6. };
  7. QT_BEGIN_NAMESPACE
  8. Q_DECLARE_INTERFACE(Tax,"TaxDLL/1.0");  //这个宏用声明接口
  9. QT_END_NAMESPACE

然后从写一个具体业务类,继承上面的接口和QObject,实现接口中定义的方法

  1. TaxPlugin.h
  2. class  TaxPlugin:public QObject,Tax
  3. {
  4. Q_OBJECT
  5. Q_INTERFACES(Tax)
  6. public:
  7. float incomeTax(int income);
  8. };
  9. TaxPlugin.cpp
  10. TaxPlugin::incomeTax(int income)
  11. {
  12. float res=(income-1600)*0.5;
  13. return res;
  14. }
  15. Q_EXPORT_PLUGIN2(Tax, TaxPlugin);    //这个宏用来导出动态链接库

编译工程B,生成Tax.dll.

把工程Tax.dll和头文件Tax.h,拷到工程A中,供工程A使用.

工程A中

  1. int main()
  2. {
  3. Tax *taxObject;
  4. QPluginLoader pluginLoader("Tax.dll");
  5. QObject *plugin = pluginLoader.instance();
  6. taxObject= qobject_cast<Tax *>(plugin);
  7. taxObject->incomeTax(2100);
  8. }
 
      如果税率变了,只要修改工程B中的类,然后重新编译生成Tax.dll,替换工程A中原来的库.而工程A不必重新
编译即可使用新的计税方式.
     现在有些软件有自动升级功能,有些就是下载新的DLL文件,替换原来的动态链接库,MFC好象也有类似机制.
 
      Qt还有一种方式,就是把一个QWidget子类,编译成动态链接库.然后根据动态链接库创建一个对象,返回
QWidget子针,如果你的类不是QWidget的子类,就不能用这种方法了
 
      QLibrary也是用来加载动态链接库,但它创建出来返回的是某个"方法的指针"(不需要头文件),而QPluginLoader
创建返回的是"对象的指针"(对象中有哪些方法可调用,就要头文件说了,所以上面的例子中,需要提供一个接口头文件)
动态
 
      小结:Qt 中动态链接库 的内容介绍完了,希望本文对你有所帮助。

深度解析 Qt 中动态链接库的更多相关文章

  1. 深度解析javascript中的浅复制和深复制

    原文:深度解析javascript中的浅复制和深复制 在谈javascript的浅复制和深复制之前,我们有必要在来讨论下js的数据类型.我们都知道有Number,Boolean,String,Null ...

  2. 深度解析VC中的消息(转发)

    http://blog.csdn.net/chenlycly/article/details/7586067 这篇转发的文章总结的比较好,但是没有告诉我为什么ON_MESSAGE的返回值必须是LRES ...

  3. 解析Qt中QThread使用方法

    本文讲述的是在Qt中QThread使用方法,QThread似乎是很难的一个东西,特别是信号和槽,有非常多的人(尽管使用者本人往往不知道)在用不恰当(甚至错误)的方式在使用QThread,随便用goog ...

  4. Qt中动态链接库的使用

    转自: http://www.qtcn.org/bbs/read.php?tid=14719 现在有些软件有自动升级功能,有些就是下载新的DLL文件,替换原来的动态链接库.MFC好象也有类似机制 Qt ...

  5. 【转载】深度解析Android中字体设置

    原文:http://mobile.51cto.com/android-265238.htm 1.在Android XML文件中设置字体 可以采用Android:typeface,例如android:t ...

  6. 深度解析Java中的那把锁

    锁的本质 我们先来讨论锁的出现是为了解决什么问题,锁要保证的事情其实很好理解,同一件事(一个代码块)在同一时刻只能由一个人(线程)操作. 这里所说的锁为排他锁,暂不考虑读写锁的情况 我们在这里打个比方 ...

  7. 深度解析VC中的消息传递机制

    摘要:Windows编程和Dos编程,一个很大的区别就是,Windows编程是事件驱动,消息传递的.所以,要学好Windows编程,必须 对消息机制有一个清楚的认识,本文希望能够对消息的传递做一个全面 ...

  8. 深度解析Struts2中ValueStack

    1.什么是ValueStack 对于每一个action的调用,Struts在执行相应的动作方法之前会先创建一个名为ValueStack的对象.Value Stack用来保存该动作对象或者对象.由于最终 ...

  9. 深度解析VC中的消息

    消息是指什么? 消息系统对于一个win32程序来说十分重要,它是一个程序运行的动力源泉.一个消息,是系统定义的一个32位的值,他唯一的定义了一个事件,向Windows发出一个通知,告诉应用程序某个事情 ...

随机推荐

  1. 基于【 Docker】一 || ElK安装部署使用教程

    一.ELK介绍 1.ELK组成 ELK由Elasticsearch.Logstash和Kibana三部分组件组成: Elasticsearch是个开源分布式搜索引擎,它的特点有:分布式,零配置,自动发 ...

  2. php压缩图片

    <?php header('content-type:text/html;charset=utf8'); set_time_limit(0); $imgs=scandir('./Public/u ...

  3. 【Day3】4.Xpath语法与案例

    课程目标 1.谷歌浏览器配置Xpath 2.Xpath常用语法 3.Xpath常用案例 1.谷歌浏览器配置Xpath Xpath下载:http://chromecj.com/web-developme ...

  4. php连接docker运行的mysql,显示(HY000/2002): Connection refused的解决办法

    php要连接docker中运行的mysql是不能用localhost, 127.0.0.1来连接的,因为每个docker运行容器的localhost 127.0.0.1都是自己容器本身,不是mysql ...

  5. Kubernetes对象中的PersistentVolume、PersistentVolumeClaim和StorageClass的概念关系

    Kubernetes容器要持久化数据,离不开volume,k8s的volume和Docker原生概念中的volume有一些差别,不过本次不讲这个,本次要明确的是k8s持久化数据用到的几个对象Persi ...

  6. Django drf:cbv源码、resful规范及接口、drf使用、response源码、序列化

    一.cbv源码分析 二.resful规范 三.django中写resful的借口 四.drf写resful的借口 五.APIVIew源码分析 六.drf之序列化 一.cbv源码分析 -CBV和FBV ...

  7. IDEA 运行报错:WARN: Establishing SSL connection

    使用JDBC连接数据库时出现报错, 报错内容:Wed Sep 26 14:30:31 CST 2018 WARN: Establishing SSL connection without server ...

  8. 基本算法 st

    今天困得不行,就看了个小算法st,其实和线段树的作用一样, 不过这个算法没有用到数据结构,使用二进制优化的 是O(log(n)n)的时间预处理,然后以O(1)的时间返回(l,r)上的最大或最小 #in ...

  9. 如何给mysql数据库添加一个用户

    首先以root身份登录到MySQL服务器中. $ mysql -u root -p 当验证提示出现的时候,输入MySQL的root帐号的密码. 创建一个MySQL用户 使用如下命令创建一个用户名和密码 ...

  10. Gym - 102028H Can You Solve the Harder Problem? (后缀数组+RMQ+单调栈)

    题意:求一个序列中本质不同的连续子序列的最大值之和. 由于要求“本质不同”,所以后缀数组就派上用场了,可以从小到大枚举每个后缀,对于每个sa[i],从sa[i]+ht[i]开始枚举(ht[0]=0), ...