Qt6之vc调用qt生成的带ui的dll

news2025/4/6 23:02:08

受益于跨平台的特性,Qt生成dll的各种语言调用上体现的淋漓尽致,上篇已经演示了qt生成的无ui的dll及vc如何调用它,本篇将演示vc如何调用qt生成的带ui的dll。

传统观点认为Qt生成的带ui的dll受限于 QApplication 的 exec 方法,这样才能产生消息循环于是只能采用QTWinmigrate中重写DllMain函数,但是仔细看该方案太繁琐和冗余了,于是受上篇启发,进行了以下尝试,果然可以。

一、新建qt widgets项目

因为在qt dll项目中我们不方便调试和布局界面,所以推荐方案是新建一个qt widgets项目。

在该项目中将ui布局好,如下图新建一个mainwindow的项目,没有添加任何一行代码,仅在控件编辑里拖出来两个控件,然后用信号槽关联起来,这样在滑动下面滑块时,上面进度条可以跟着变化。

1、 ui设计器如下;

 2、源码如下,如你所见它全部是qt craeator向导建完项目后自动生成的,没有手动改写任何一行代码;

 3、切换到Release编译,正常运行;

 二、新建一个dll项目

这个步骤,完全按照向导进行即可;

1、新建库项目;

2、注意勾选qt widgets模块;

 3、尝试包含QMainWindow.h如果不报错那就可以了;

 4、把第一步中新建的widgets项目中的.h .cpp .ui三个文件(注意不需要main.cpp),全部复制到项目目录下并添加到项目中,如下图;

 5、在dll项目中,声明一个成员函数,必须是int形参和返回值的函数,然后定义如下;

 6、原来main.cpp包含的头文件,也在这里包含上,然后把main函数修改后如下:

//以下为原来main.cpp,可对比以下,其实就是把main函数用一个成员函数换掉,形参稍作变化,让qt的事件循环继续存在 

 

 7、也切换到Release,然后构建,最后如图右边,生成了dll和.lib,把除这两个文件外的临时文件全部删除;

 8、找到对应编译器的命令行,然后命令在切换到dll所在目录下;

 9、qt的命令行,解决带ui的dll还依赖的qt dll,成功后如下图2;

 

 三、VC项目调用

1、新建控制台项目,切到Release x64,生成一个exe,确认项目无误;

2、把上面第9步生成的所有文件复制到vc项目exe输出文件夹里;

 3、把9步生成的.lib文件、dll项目所带两个.h(后面复制的不需要),全部复制到vs项目目录下,并把.lib添加到资源,把.h添加到项目里;

4、将两个.h所用到的Qt的头文件直接屏蔽,并把global.h结尾的文件里添加红色框内容如下:

#if defined(_MSC_VER) || defined(WIN64) || defined(_WIN64) || defined(__WIN64__) || defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(__NT__)
#  define Q_DECL_EXPORT __declspec(dllexport)
#  define Q_DECL_IMPORT __declspec(dllimport)
#else
#  define Q_DECL_EXPORT     __attribute__((visibility("default")))
#  define Q_DECL_IMPORT     __attribute__((visibility("default")))
#endif

 5、包含头文件,实例化该类并调用,如下图2可以看到完美的通过VC++正常调用带ui的qt生成的dll;

 6、把Release复制到没有编译环境的电脑中,测试,也可正常运行;

 总结,至此完成了,vc项目调用qt生成的带ui的dll,它比采用QTWinmigrate中重写DllMain函数的方法更加易于理解和调用。

此项目为了演示没有用线程,因为qt的事件循环机制,事实上应该新建一个线程在线程内部调用更加合理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/620053.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《精通特征工程》学习笔记(6):非线性特征化与k-均值模型堆叠

1.非线性特征 当数据位于一个薄饼状的线性子空间时,PCA 是非常有用的。但如果数据形成了一个更加复杂的形状,情况又将如何呢? 如果线性子空间是一张平展的纸,那么非线性流形的一个简单例子就是卷起来的纸,它有 个非…

《人人健康》期刊简介及投稿邮箱

《人人健康》期刊简介及投稿邮箱 《人人健康》期刊简介: 主管单位:山西出版传媒集团有限责任公司 主办单位:山西三晋报刊传媒集团有限责任公司 国际刊号ISSN:1004-597X 国内刊号CN:14-1033/R 邮发代号&#xff1…

不甘做小弟,JS时间对象又在搞事情!(上)

关注“大前端私房菜”微信公众号,回复暗号【面试宝典】即可免费领取107页前端面试题。 Date Date 是 js 的一个内置对象,也叫内置构造函数。提供了一堆的方法帮助我们更方便的操作时间 创建时间对象:new Date() 获取时间对象:ne…

NTSC和PAL视频格式的区别

1,历史演变 NTSC早期描述的是525I59.94格式视频,1953年确立标准,美国主导。后来为了方便和PAL制式格式的视频转换,于是将60hz的倍数关系的帧率纳入该系统。 PAL描述的是625I50格式视频,1967年确立标准,欧洲…

完全免费白嫖 GPT-4 的终极方案!

原文链接:https://icloudnative.io/posts/completely-free-to-use-gpt4/ GPT-4 目前是世界上最强的多模态大模型,能力甩 GPT-3.5 好几条街。 大家都希望早日用上 GPT-4,不过目前体验 GPT-4 的渠道非常有限,要么就是开通 ChatGPT …

Java编程笔记31:Record

Java编程笔记31:Record 图源:Fotor懒设计 在日常使用的时候,我们往往需要创建一些“仅用于传输数据的类型”,比如Web编程时候的DTO。 将特殊用途的类型限制为“只读”的一个好处是,这些类型可以安全地在多线程之间共享…

uniapp开发小程序-显示左滑删除效果

一、效果图&#xff1a; 二、代码实现&#xff1a; <template><view class"container"><view class"myorderList"><uni-swipe-action><uni-swipe-action-item class"swipe-action-item" :right-options"option…

【严重】Nacos 集群Raft反序列化漏洞

漏洞描述 Nacos是一个用于动态服务发现和配置以及服务管理的平台。 攻击者可以在Nacos集群处理某些Jraft请求时利用Hessian进行无限制的反序列化&#xff0c;从而造成远程代码执行。 由于Nacos默认监听7848端口处理Raft协议请求&#xff0c;攻击者可能通过向7848端口发送恶意…

[笔记]C++并发编程实战 《四》同步并发操作

文章目录 前言第4章 同步并发操作4.1 等待一个事件或其他条件4.1.1 等待条件达成4.1.2 使用条件变量构建线程安全队列 4.2 使用期望值等待一次性事件4.2.1 后台任务的返回值4.2.2 任务与期望值关联4.2.3 使用(std::)promises4.2.4 将异常存与期望值中4.2.5 多个线程的等待 前言…

【Mysql】InnoDB 中的聚簇索引、二级索引、联合索引

一、聚簇索引 其实之前内容中介绍的 B 树就是聚簇索引。 这种索引不需要我们显示地使用 INDEX 语句去创建&#xff0c;InnoDB 引擎会自动创建。另外&#xff0c;在 InnoDB 引擎中&#xff0c;聚簇索引就是数据的存储方式。 它有 2 个特点&#xff1a; 特点 1 使用记录主键…

【每日挠头算法题(2)】压缩字符串|仅执行一次字符串交换能否使两个字符串相等

文章目录 一、压缩字符串思路 二、仅执行一次字符串交换能否使两个字符串相等思路1&#xff1a;计数法思路2&#xff1a;模拟法 总结 一、压缩字符串 点我直达~ 思路 使用双指针法 大致过程如下&#xff1a; 使用双指针&#xff0c;分别读&#xff08;read&#xff09;&…

mPak的使用文档

mpak介绍 mpak是一种文件格式&#xff0c;同时也是一款虚幻引擎插件&#xff0c;该插件提供了打包、解析和挂载mPak文件的方法&#xff0c;将不同平台的软件包和未编译的资源集成到mPak文件中&#xff0c;该文件具有跨平台兼容性。它支持不同阶段的挂载&#xff0c;例如在编辑…

monaco-editor插件自定义编辑器内容颜色

开始之前先说一下他的自定义内容颜色的api monaco.languages.setMonarchTokensProvider((languageId: string, languageDef: IMonarchLanguage | Thenable<IMonarchLanguage>)) 参数解析&#xff1a;接收两个参数 一个是你要设置的编辑器语言种类&#xff0c;可以是sq…

Ubuntu14.04安装igH EtherCAT Master

一、下载EtherCAT安装包 安装包下载路径&#xff1a;EtherLab EtherCAT Master / Code / [334c34]&#xff0c;打开后点击Download下载 二、安装前置依赖库 最好切换到root用户进行下列步骤 apt-get install autoconf automake libtool net-tools三、编译安装 解压安装包&a…

excel如何折叠展开行列?

Excel可以使用分组功能来实现折叠展开行列的效果&#xff0c;同时可以在单元格内添加号或-号来进行操作。 具体步骤如下&#xff1a; 1. 选中需要进行折叠展开的行或列&#xff0c;右键选择“分组”。 2. 在弹出的“分组”对话框中&#xff0c;选择“行”或“列”&#xff0…

『赠书活动 | 第十一期』清华社赞助 | 《Python系列丛书》

&#x1f497;wei_shuo的个人主页 &#x1f4ab;wei_shuo的学习社区 &#x1f310;Hello World &#xff01; 『赠书活动 &#xff5c; 第十一期』 本期书籍&#xff1a;《Python系列丛书》 公众号赠书&#xff1a;第三期 参与方式&#xff1a;关注公众号&#xff1a;低调而奢…

逻辑回归分类器-创建词向量-情感分析

题目 请使用您今天学习的逻辑回归分类器对下面的聊天机器人数据进行自动分类。&#xff08;3分&#xff09; https://github.com/songys/Chatbot_data&#xff08;ChatbotData.csv文件&#xff09; https://raw.githubusercontent.com/songys/Chatbot_data/master/ChatbotDa…

【职业人生】如何有效的在职场当中避免工作失误和提高个人发展

《左传宣公二年》&#xff1a;“人谁无过&#xff0c;过而能改&#xff0c;善莫大焉。”古往今来&#xff0c;多少人犯过错误。强大如“智绝”的诸葛孔明&#xff0c;也有街亭之失。职场人更是难免会在工作中出现失误。 在职场生涯当中避免不了在工作当中带来的失误&#xff0c…

【Hadoop综合实践】手机卖场大数据综合项目分析

&#x1f680; 本文章实现了基于MapReduce的手机浏览日志分析 &#x1f680; 文章简介&#xff1a;主要包含了数据生成部分&#xff0c;数据处理部分&#xff0c;数据存储部分与数据可视化部分 &#x1f680; 【本文仅供参考】其中需求实现的方式有多种&#xff0c;提供的代码并…

从0到1搞定在线OJ

目录 一、在线OJ的的原理 二、在线OJ的使用规则 三、注意事项 1.关于作弊 2.如何防止作弊 3.输入输出格式 4.换行问题 四、经典在线OJ坑人题目以及博主被坑经历 五、提交不成功及解决方法 六、如何得心应手的拿下OJ系统 七、在线OJ的骗分技巧 在线OJ&#xff08;Onl…