博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
生成QT动态库DLL指导
阅读量:4357 次
发布时间:2019-06-07

本文共 1027 字,大约阅读时间需要 3 分钟。

生成QT动态库指导

1 背景

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

2 问题

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

3 分析

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

3.1 错误方法,可以略过

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

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

3.2 正确方法

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

在VS中位置如下:

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

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

QDESIGNER_EXPORT_WIDGETS

QT_DESIGNER_LIB

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

qdesignerexportwidget.h

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

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

4 总结

4.1 生成DLL具体流程

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

4.1.1 生成QT库

勾选Widget

4.1.2 添加预处理器 QDESIGNER_EXPORT_WIDGETS

4.1.3 添加接口类

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

4.1.4 修改Inter.h文件

1、导出接口类

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

2、构造参数默认NULL:

4.1.5 编译.lib,.dll

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

4.2 调用DLL流程

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

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

转载于:https://www.cnblogs.com/fluteary/p/6609879.html

你可能感兴趣的文章
两台服务器打通了秘钥,依然无法免密登录的问题
查看>>
查看进程的准确启动时间
查看>>
在Linux下解压xz压缩文件
查看>>
关于redis闪退的案例
查看>>
Ansible-随笔-7
查看>>
Ansible随笔8
查看>>
访问nginx时验证密码
查看>>
将时间 '2018-08-06T10:00:00.000Z' 格式转化为本地时间
查看>>
为kubectl配置别名和命令行补齐
查看>>
解决在python中进行CGI编程时无法响应的问题
查看>>
记录一次MySQL数据库CPU负载异常高的问题
查看>>
python查看redis版本
查看>>
安装go环境
查看>>
安装kubernetes-dashboard
查看>>
从容器拷贝文件
查看>>
随笔-ansible-2
查看>>
腾讯云时间服务器
查看>>
nginx基础内容
查看>>
在CentOS 7上安装常用的YUM源
查看>>
getattr和setattr
查看>>