打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
【转】深度解析 Qt 中动态链接库 - 柳北风儿~~~~~~~欲宇仙炅 - ITeye技术网站

本文介绍的是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. }   
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()必须改写了;


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

 

头文件没有变,只是修改了计税方式,工程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   
//首先定义接口(只要一个头文件即可)  
Tax.h
class Tax
{
virtual float incomeTax(int income);
};
QT_BEGIN_NAMESPACE
Q_DECLARE_INTERFACE(Tax,'TaxDLL/1.0'); //这个宏用声明接口
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);    //这个宏用来导出动态链接库  
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中


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. }   
int main()  
{
Tax *taxObject;
QPluginLoader pluginLoader('Tax.dll');
QObject *plugin = pluginLoader.instance();
taxObject= qobject_cast<Tax *>(plugin);
taxObject->incomeTax(2100);
}


      如果税率变了,只要修改工程B中的类,然后重新编译生成Tax.dll,替换工程A中原来的库.而工程A不必重新
编译即可使用新的计税方式.

     现在有些软件有自动升级功能,有些就是下载新的DLL文件,替换原来的动态链接库,MFC好象也有类似机制.



      Qt还有一种方式,就是把一个QWidget子类,编译成动态链接库.然后根据动态链接库创建一个对象,返回
QWidget子针,如果你的类不是QWidget的子类,就不能用这种方法了



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



      小结:Qt 中动态链接库 的内容介绍完了,希望本文对你有所帮助。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
qwt5 的编译和使用注意事项
彻底解决QQ无法定位程序输入点...于动态链接库qt-mt33...
qt5core.dll下载
Windows如何打包Qt程序
Qt开发ActiveX及环境搭建
QT在windows上发布之所需运行库(一)
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服