zoukankan      html  css  js  c++  java
  • 深度解析 Qt 中动态链接库

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

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

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

    写一个例子说明吧:

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

    Cpp代码  收藏代码
    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()必须改写了;

    Cpp代码  收藏代码
    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类做成动态链接库的形式:

    Cpp代码  收藏代码
    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,实现接口中定义的方法

    Cpp代码  收藏代码
    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中

    Cpp代码  收藏代码
    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 中动态链接库 的内容介绍完了,希望本文对你有所帮助。
  • 相关阅读:
    Educational Codeforces Round 83 --- F. AND Segments
    Educational Codeforces Round 83 --- G. Autocompletion
    SEERC 2019 A.Max or Min
    2019-2020 ICPC Southwestern European Regional Programming Contest(Gym 102501)
    Educational Codeforces Round 78 --- F. Cards
    今天我学习了一门全新的语言
    codeforces 1323D 题解(数学)
    Educational Codeforces Round 80 (Div. 2) 题解 1288A 1288B 1288C 1288D 1288E
    Educational Codeforces Round 81 (Div. 2) 题解 1295A 1295B 1295C 1295D 1295E 1295F
    Codeforces Round #617 (Div. 3) 题解 1296C 1296D 1296E 1296F
  • 原文地址:https://www.cnblogs.com/lvdongjie/p/3758108.html
Copyright © 2011-2022 走看看