转自: http://www.qtcn.org/bbs/read.php?tid=14719
现在有些软件有自动升级功能,有些就是下载新的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创建返回的是"对象的指针"(对象中有哪些方法可调用,就要头文件说了,所以上面的例子中,需要提供一个接口头文件)

 
http://blog.csdn.net/mociml/article/details/5626189

Qt中动态链接库的使用的更多相关文章

  1. 深度解析 Qt 中动态链接库

    本文介绍的是Qt 中动态链接库,现在有些软件有自动升级功能,有些就是下载新的DLL文件,替换原来的动态链接库,MFC好象也有类似机制,Qt还有一种方式,就是把一个QWidget子类,编译成动态链接库. ...

  2. 怎样在Qt中建立使用动态链接库

    参考网址: https://blog.csdn.net/q496713258/article/details/6990837 qt 的学习网址: http://c.biancheng.net/view ...

  3. 使用Boost的DLL库管理动态链接库(类似于Qt中的QLibrary)

    Boost 1.61新增了一个DLL库,跟Qt中的QLibrary类似,提供了跨平台的动态库链接库加载.调用等功能.http://www.boost.org/users/history/version ...

  4. Windows平台下Qt中glut库的使用

    用Qt中的QGLWidget窗体类中是不包括glut工具库的,难怪在myGLWidget(在我的程序中是QGLWidget的派生类)中绘制实心球体是说“glutSolidSphere”: 找不到标识符 ...

  5. QT中静态库的生成与使用

    一. 静态库的生成    1. 测试目录: lib    2. 源码文件名: mywindow.h, mywindow.cpp, 类MyWindow继承于QPushButton, 并将文字设置为&qu ...

  6. OpenCV2学习笔记03:Qt中配置OpenCV环境

    在Qt中开发基于OpenCV的应用时,需要配置对应函数库到环境变量,这时候我们需要使用到qmake能够识别的变量来指定环境变量. INCLUDEPATH: 用于指定搜索头文件到文件夹路径. LIBS: ...

  7. QT中使用Glut库

    用Qt中的QGLWidget窗体类中是不包括glut工具库的,难怪在myGLWidget(在我的程序中是QGLWidget的派生类)中绘制实心球体是说“glutSolidSphere”: 找不到标识符 ...

  8. QT中共享库的生成与使用

    一. 静态库的生成1. 测试目录: lib2. 源码文件名: mywindow.h, mywindow.cpp, 类MyWindow继承于QPushButton, 并将文字设置为"I'm i ...

  9. Qt中如何 编写插件 加载插件 卸载插件

    Qt中如何 编写插件 加载插件 卸载插件是本文要介绍的内容.Qt提供了一个类QPluginLoader来加载静态库和动态库,在Qt中,Qt把动态库和静态库都看成是一个插件,使用QPluginLoade ...

随机推荐

  1. JavaScript —— 常用数据类型隐式转换

    公用方法: let checkType = (data) => { if(data){ console.log(true); }else{ console.log(false); } } 一.字 ...

  2. Directx11学习笔记【二十一】 封装键盘鼠标响应类

    原文:Directx11学习笔记[二十一] 封装键盘鼠标响应类 摘要: 本文由zhangbaochong原创,转载请注明出处:http://www.cnblogs.com/zhangbaochong/ ...

  3. UITextField 自定义clearButton背景色

    一个鸡贼的解决方案,适用于自定义clearButton的样式,直接修改背景图即可 1. 实现基于UITextField的category并添加如下方法及声明 - (void)setLightStyle ...

  4. oracle函数 TO_DATE(X[,c2[,c3]])

    [功能]将字符串X转化为日期型 [参数]c2,c3,字符型,参照to_char() [返回]字符串 如果x格式为日期型(date)格式时,则相同表达:date x 如果x格式为日期时间型(timest ...

  5. OpenKruise - 云原生应用自动化引擎正式开源

    2019 年 6 月 24 日至 26 日, 由 Cloud Native Computing Foundation (CNCF) 主办的云原生技术大会 KubeCon + CloudNativeCo ...

  6. HZOJ Drink

    神仙题,打了个whs式暴力卡常卡A了(我没脸),正解还是要打的,然而作者的题解看不懂…… Drink: 看惯了罗马音的小朋友们都会知道r发l的音,题目名:D Link. 每次修改都会改变O( N ^  ...

  7. Python copy(), deepcopy()

    copy() 浅拷贝: 创建一组拷贝对象的引用.切片操作相当于浅拷贝,会生成一个新的对象,新的对象里保存原对象的引用. 如果原对象中的可变对象改变(list),那么浅拷贝的对象随之改变,如果原对象中不 ...

  8. 唯一索引与非唯一索引区别(UNIQUE INDEX, NON-UNIQUE INDEX)

    索引是我们经常使用的一种数据库搜索优化手段.适当的业务操作场景使用适当的索引方案可以显著的提升系统整体性能和用户体验.在Oracle中,索引有包括很多类型.不同类型的索引适应不同的系统环境和访问场景. ...

  9. 本地运行angularjs应用,提示出现跨域问题

    应用介绍: 使用angularjs创建一个简单的公司员工管理页面 使用Chrome打开后,提示存在跨域问题. 和别人交流后,得知使用像Angular,React,Vue框架,在Chrome地址栏中输入 ...

  10. axios用headers传参,设置请求头token

    新建一个配置文件http.js // 导入axios import axios from 'axios'; // 全局配置默认路由 axios.defaults.baseURL = 'http://1 ...