生成QT动态库DLL指导

生成QT动态库指导

1 背景

准备将常用接口封装成“类似QT提供的具有MOC特性的”DLL,这样可以方便地使用QT的信号和槽机制。

2 问题

用VS2015+QT或者QtCreater生成的QT的DLL其实都为C++标准DLL,无法使用QT的信号和槽。手动修改代码,添加上O_OBJECT之后,成功导出动态库。但是调用此动态库的时候,报错:无法导入静态数据成员。查看代码:

clip_image002

3 分析

QT自己的库,可以使用信号和槽,那肯定是我们的方法不对了。

3.1 错误方法,可以略过

查看代码,Meta-object可以动态生成,参见:

clip_image004

设置Q_MOC_RUN之后,确实再没有静态成员,但是编译错误太多了。改不胜改,应该是有其他关联设置,总之放弃这种方法。

3.2 正确方法

在QtCreater中,看到QT有Plugin库,用来生成可以加载到QtDesigner中的自定义库。

在VS中位置如下:

clip_image006

稍微改造其生成的代码,发现可以生成可以正常调用的动态库。

查看其代码,发现它定义了两个可疑预编译宏:

QDESIGNER_EXPORT_WIDGETS

QT_DESIGNER_LIB

最终确认,需要第一个宏。具体的原理只能跟踪到:

qdesignerexportwidget.h

clip_image008

后面的代码看不到了,有兴趣的同学可以再研究下。

该宏字面上有Widget字样,如果导出类继承自QObject是否可以用呢?经过实验,是不行的。要导出QObject子类,没有找到对应的宏。时间关系,先挂起。

4 总结

4.1 生成DLL具体流程

下面说一下这种导出QT库方法的具体流程。

4.1.1 生成QT库

clip_image010

勾选Widget

clip_image012

4.1.2 添加预处理器 QDESIGNER_EXPORT_WIDGETS

clip_image014

4.1.3 添加接口类

注意: 基类和构造函数都必须设置为:QWidget

clip_image016

4.1.4 修改Inter.h文件

1、导出接口类

clip_image018

说明:如果动态库中某一个类里面有槽函数,则必须加入导出宏。

2、构造参数默认NULL:

clip_image020

4.1.5 编译.lib,.dll

为了方便调试,建议同时编译DEBUG版和RELEASE版。

4.2 调用DLL流程

添加Inter.h,TestQtDll.dll,TestQtDll.lib,采用间接调用。

构造类实例时,传入NULL,使用完成手动释放资源。

posted @ 2017-03-24 09:54  天逸笛仙  阅读(1326)  评论(0编辑  收藏  举报