`
qimo601
  • 浏览: 3444072 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

【转】深度解析 Qt 中动态链接库

    博客分类:
  • Qt
阅读更多

转载:http://mobile.51cto.com/symbian-270525.htm

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

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

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

写一个例子说明吧:

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

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()必须改写了;

Tax::incomeTax(int income)  
{  
float res=(income-2000)*0.3;  
return res;  
}
 

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

 

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

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

 

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

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

 

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中

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 中动态链接库 的内容介绍完了,希望本文对你有所帮助。
分享到:
评论

相关推荐

    QT动态库libMAD_64bit

    这个库是通过QTCreator集成开发环境和64位mingw编译器编译生成的,包含了静态库(.a文件)和动态链接库(.dll文件)两个组成部分,确保了在64位环境下对MP3音频内容的高效处理。 libMAD,全称Mobile Audio Decoder...

    Libpcap+QT

    首先,我们需要在QT环境中集成Libpcap库,这通常涉及设置项目的编译链接选项,确保在编译时能正确链接到Libpcap库。然后,我们可以创建一个主线程负责数据包捕获,利用Libpcap的`pcap_open_live()`函数打开网络接口...

    ext4写的动态库_QT_ext4

    标题"ext4写的动态库_QT_ext4"暗示了这是一个使用Qt框架开发的项目,目标是创建一个与ext4文件系统交互的动态链接库。ext4是一种广泛使用的Linux文件系统,而Qt则是一个跨平台的C++图形用户界面应用程序开发框架。这...

    pcl1.12.1 搭配qt6 使用

    - `bin`:存放可执行文件和动态链接库,用于运行时使用。 - `cmake`:可能包含CMake配置文件,用于构建PCL项目。 - `share`:通常包含文档、资源文件等。 6. 集成步骤: - 安装PCL和Qt,确保环境配置正确。 - ...

    qtwebengine5.15.2

    在这个场景下,可能会有Qt WebEngine的动态链接库和相关工具。 3. **plugins**:Qt的插件系统允许添加额外的功能。这里可能包含用于解码不同媒体格式的插件,如mp4视频和音频文件,以及其他扩展WebEngine功能的插件...

    QT系统教程手把手

    ### Qt系统教程手把手——深度解析QtCreator的安装与应用 #### 一、QtCreator的安装及HelloWorld程序创建 **知识点1:QtCreator的安装** - **官方网站下载**:QtCreator可在Qt官方网站...

    Qt pdf poppler

    【Qt与PDF处理:Poppler库的深度解析】 在IT领域,Qt是一个广泛使用的C++图形用户界面应用程序框架,它提供了丰富的功能,包括窗口管理、输入处理、2D和3D渲染等。而当我们需要在Qt应用中处理PDF文档时,通常会引入...

    libmysql.rar

    本篇文章将深入探讨“libmysql.dll”这个重要的动态链接库(Dynamic Link Library)在QT框架下64位系统中的应用及其重要性。我们将从“libmysql.dll”的功能、QT与MySQL的连接、解决缺失dll文件问题以及最佳实践等...

    一键将照片转漫画风格工具

    1. Qt5系列的dll文件(如Qt5MagicImage.dll, Qt5Gui.dll, Qt5Core.dll, Qt5Widgets.dll等):这是Qt框架的动态链接库,Qt是一个跨平台的应用程序开发框架,广泛用于GUI(图形用户界面)编程。这些文件可能包含了工具...

    PropertyBrowser.rar

    4. **编译与链接**:执行编译命令,生成对应的dll动态链接库文件。这个过程可能需要设置额外的编译标志,比如包含路径、库路径等,以确保所有依赖项都能正确找到。 5. **测试与验证**:编译完成后,通过运行示例...

    x64dbg纯净全代码编译含2019-9-19最新中文版

    1. Qt5Gui.dll、Qt5Core.dll、Qt5Widgets.dll:这些是Qt框架的动态链接库,用于构建x64dbg的图形用户界面。Qt是一个跨平台的应用程序开发框架,使得x64dbg可以在多种操作系统上拥有一致的用户界面。 2. X64GUI.dll...

    snipaste截屏工具

    1. **依赖库文件**:在提供的文件列表中,我们可以看到如Qt5系列的动态链接库文件,它们是Qt框架的重要组成部分。Qt是一个跨平台的应用程序开发框架,用于创建图形用户界面和其他软件。这些库文件确保了Snipaste在...

    目标检测图像标注工具labelImg直接可执行文件(可预设值分类名称)

    在提供的压缩包中,包含了多个Qt相关的动态链接库文件,如Qt5Gui.dll、Qt5Core.dll、Qt5Widgets.dll等,这些是Qt库的核心组件,负责处理GUI显示、事件处理和应用程序的基本功能。另外,还有Qt5Quick.dll和Qt5Qml.dll...

    SkeyeARS-v2.0.22.1102.zip

    - opencv_world440.dll:这是OpenCV库的动态链接库版本,OpenCV是一个广泛使用的计算机视觉库,提供了多种图像处理和机器学习算法,用于SkeyeARS中的视觉分析任务。 - NvDecoder.dll:这是NVIDIA的视频解码器,专...

    Snipaste-2.2.3-Beta-x86.zip.zip

    Snipaste的高效运行离不开一系列关键的动态链接库(DLL)文件。在提供的压缩包中,我们可以看到诸如Qt5Gui.dll、Qt5Core.dll、Qt5Widgets.dll等文件,这些都是由Qt框架提供的核心组件。Qt是一个跨平台的应用程序开发...

    鲁班雕刻软件GrblCNC

    在提供的文件列表中,我们看到了多个与Qt库相关的动态链接库(DLL)文件,如Qt5Widgets.dll、Qt5Core.dll和Qt5Gui.dll。Qt是一个跨平台的应用程序开发框架,用于创建图形用户界面和其他软件。这些库文件是GrblCNC...

    Snipaste 64bit.rar

    在这款软件的背后,是一系列关键的动态链接库(DLL)文件,这些文件是程序正常运行不可或缺的部分。接下来,我们将深入探讨这些DLL文件的作用及其对Snipaste的重要性。 首先,Qt5系列的三个DLL文件——Qt5Gui.dll、...

    depthmapX-0.7.0_win64.zip

    2. Qt5Gui.dll、Qt5Core.dll、Qt5Widgets.dll:这些都是Qt框架的动态链接库文件,Qt是一个流行的跨平台应用程序开发框架,用于构建用户界面。这里,它们为DepthmapX提供了图形用户界面、核心功能和控件支持。 3. d3...

    Advanced_IP_Scanner

    在Advanced_IP_Scanner的压缩包文件中,我们看到了多个动态链接库(DLL)文件,这些文件是软件运行所必需的组件: 1. QtGui4.dll和QtNetwork4.dll:这是Qt库的一部分,一个跨平台的应用程序开发框架。QtGui负责图形...

    ffmpeg ffplay windows vs2010

    这个压缩包包含了一系列动态链接库(DLL)文件,这些文件是FFmpeg库的核心组件,用于音频和视频的编码、解码、过滤和播放。 1. **FFmpeg**: FFmpeg是一个全面的开源项目,提供了音视频处理的全套解决方案。它包括了...

Global site tag (gtag.js) - Google Analytics