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 中动态链接库 的内容介绍完了,希望本文对你有所帮助。
  • 相关阅读:
    GP服务之IDW GIS空间插值密度分布图
    Cesium添加标注
    arcgis时间滑块time slider工具
    ArcObjects和ArcEngine的区别
    Android 多媒体 1.1 获取多媒体信息[原创]
    Android 获取root权限 实现重启
    Android GIF 编解码
    中国的程序员只能支撑到30岁么。
    Android通过摇晃手机的频率来控制声音的频率
    Android ListView 下拉刷新 上拉更多[实例]
  • 原文地址:https://www.cnblogs.com/lvdongjie/p/3758108.html
Copyright © 2011-2022 走看看