深度解析 Qt 中动态链接库

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

本文介绍的是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. ............  

编译后部署到机器上.

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

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

头文件没有变,只是修改了计税方式,工程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. taxObjectqobject_cast<Tax *>(plugin);  
  7. taxObject->incomeTax(2100);  

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

现在有些软件有自动升级功能,有些就是下载新的DLL文件,替换原来的动态链接库。

MFC好象也有类似机制

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

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

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

责任编辑:zhaolei 来源: 互联网
相关推荐

2022-06-09 09:54:45

编译软件开发

2012-05-08 14:48:23

LinuxUnix动态链接库

2024-06-06 08:53:13

动态链接库共享库

2012-05-04 08:24:14

LinuxUnix

2009-08-28 16:19:30

C#实现修改动态链接库

2011-05-18 17:15:45

2009-07-07 20:57:20

LinuxUnix动态链接库

2024-03-01 20:59:11

C#DLL开发

2022-05-03 23:44:21

Python动态链接库Ctypes

2011-06-09 11:11:35

QT 静态库 动态库

2023-05-09 08:24:11

JNA链接库代码

2009-08-05 16:29:18

C#调用C++动态链接

2022-10-24 00:03:21

动态链接库DLL

2023-11-29 08:31:20

PythonRust

2009-10-29 16:36:49

VB.NET .DLL

2011-06-21 14:01:07

QT 界面库 Embedded

2022-08-09 07:57:25

Linux操作系统Windows

2011-08-02 14:15:05

XCode 静态 链接库

2022-07-12 13:23:59

静态链接库可执行文件C 目标文件

2011-06-21 15:58:20

Qt 数据库
点赞
收藏

51CTO技术栈公众号