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

这篇具有很好参考价值的文章主要介绍了Qt6之vc调用qt生成的带ui的dll。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

受益于跨平台的特性,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的项目,没有添加任何一行代码,仅在控件编辑里拖出来两个控件,然后用信号槽关联起来,这样在滑动下面滑块时,上面进度条可以跟着变化。

Qt6之vc调用qt生成的带ui的dll,Qt6,ui,qt,开发语言

1、 ui设计器如下;Qt6之vc调用qt生成的带ui的dll,Qt6,ui,qt,开发语言

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

Qt6之vc调用qt生成的带ui的dll,Qt6,ui,qt,开发语言

Qt6之vc调用qt生成的带ui的dll,Qt6,ui,qt,开发语言

Qt6之vc调用qt生成的带ui的dll,Qt6,ui,qt,开发语言

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

Qt6之vc调用qt生成的带ui的dll,Qt6,ui,qt,开发语言

 二、新建一个dll项目

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

1、新建库项目;

Qt6之vc调用qt生成的带ui的dll,Qt6,ui,qt,开发语言

2、注意勾选qt widgets模块;

Qt6之vc调用qt生成的带ui的dll,Qt6,ui,qt,开发语言

 3、尝试包含QMainWindow.h如果不报错那就可以了;Qt6之vc调用qt生成的带ui的dll,Qt6,ui,qt,开发语言

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

Qt6之vc调用qt生成的带ui的dll,Qt6,ui,qt,开发语言

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

Qt6之vc调用qt生成的带ui的dll,Qt6,ui,qt,开发语言

 6、原来main.cpp包含的头文件,也在这里包含上,然后把main函数修改后如下:Qt6之vc调用qt生成的带ui的dll,Qt6,ui,qt,开发语言

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

 Qt6之vc调用qt生成的带ui的dll,Qt6,ui,qt,开发语言

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

Qt6之vc调用qt生成的带ui的dll,Qt6,ui,qt,开发语言

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

Qt6之vc调用qt生成的带ui的dll,Qt6,ui,qt,开发语言

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

Qt6之vc调用qt生成的带ui的dll,Qt6,ui,qt,开发语言

 Qt6之vc调用qt生成的带ui的dll,Qt6,ui,qt,开发语言

 三、VC项目调用

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

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

Qt6之vc调用qt生成的带ui的dll,Qt6,ui,qt,开发语言

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

Qt6之vc调用qt生成的带ui的dll,Qt6,ui,qt,开发语言

Qt6之vc调用qt生成的带ui的dll,Qt6,ui,qt,开发语言

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

Qt6之vc调用qt生成的带ui的dll,Qt6,ui,qt,开发语言

Qt6之vc调用qt生成的带ui的dll,Qt6,ui,qt,开发语言

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

Qt6之vc调用qt生成的带ui的dll,Qt6,ui,qt,开发语言

Qt6之vc调用qt生成的带ui的dll,Qt6,ui,qt,开发语言

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

Qt6之vc调用qt生成的带ui的dll,Qt6,ui,qt,开发语言

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

此项目为了演示没有用线程,因为qt的事件循环机制,事实上应该新建一个线程在线程内部调用更加合理。文章来源地址https://www.toymoban.com/news/detail-529284.html

到了这里,关于Qt6之vc调用qt生成的带ui的dll的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Qt6 Qt Quick UI原型学习QML第七篇

    导入 QtQuick 2.12 导入 QtQuick.Window 2.12 导入 QtQuick.Controls 2.12 导入 QtQuick.Layouts 1.3 导入 Qt.labs.calendar 1.0 矩形 { id: root 属性 int duration: 3000 } 这段代码使用了QtQuick库来创建一个用户界面。其中的Rectangle是界面的根元素。 id: root : 为Rectangle元素指定唯一的标识符root。 property int durat

    2024年02月16日
    浏览(40)
  • Qt6 Qt Quick UI原型学习QML第三篇

    图像 Image(图片)元素 解释 这段代码是使用QtQuick 2.0库来创建一个Image(图片)元素的定义。以下是代码的解释: Image 元素是一个用于显示图像的控件。 id: root 是为Image元素指定了一个标识符,以便在代码中引用它。 signal clicked 定义了一个名为 clicked 的信号。信号用于在特

    2024年02月16日
    浏览(53)
  • Qt6 Qt Quick UI原型学习QML第二篇

    元素可以分为 视觉元素和非视觉元素 。视觉元素(如Rectangle)具有几何形状,并且通常在屏幕上呈现一个区域。非可视元素(如Timer)提供一般功能,通常用于操作可视元素。 目前,我们将关注基本的视觉元素,例如 Item, Rectangle, Text, Image和MouseArea 。但是,通过使用Qt Quick Contro

    2024年02月16日
    浏览(38)
  • Qt6 Qt Quick UI原型学习QML第六篇

    import QtQuick 2.12 :导入QtQuick模块的版本2.12,用于创建Qt快速应用程序的用户界面。 import QtQuick.Window 2.12 :导入QtQuick.Window模块的版本2.12,用于创建窗口对象。 import QtQuick.Controls 2.12 :导入QtQuick.Controls模块的版本2.12,用于创建用户界面控件。 Window {} :定义了一个窗口对象,

    2024年02月16日
    浏览(49)
  • Qt6 Qt Quick UI Prototype学习QML第一篇

    创建一个具有QML入口点的Qt Quick 2 UI项目。要使用它,您需要设置一个QML运行时环境,例如gmlscene。 仅当您正在进行原型设计时才使用此功能。您无法使用此创建完整的应用程序。请考虑使用Qt Quick application项目 Qt Quick UI原型主要用于快速创建交互式的用户界面(UI)原型。它

    2024年02月16日
    浏览(49)
  • 【Qt UI相关】Qt5和Qt6中关于高DPI缩放属性

    高DPI(每英寸点数)显示器具有更高的像素密度,这意味着它们可以显示更清晰、更详细的图像。然而,如果应用程序不适应高DPI显示,它们可能会看起来模糊或者太小。为了解决这个问题,Qt提供了高DPI缩放支持。 在Qt 5中,高DPI缩放默认是禁用的,你可以通过设置 Qt::AA_

    2024年02月04日
    浏览(47)
  • QT6为工程添加资源文件,并在ui界面引用

    这种方式虽然添加到了工程中,但不能在UI设计界面完成引用。主要原因可能是未把文件放入到项目资源文件中,以下面一种方式可以看出区别。 选择qt resource file,点击选择, 然后通过下面的设置得到一个.qrc的资源文件, 鼠标右键这个资源文件,第一种添加的文件在qrc文件

    2024年02月11日
    浏览(45)
  • QT笔记——vs + qt 创建一个带界面的 dll 和 调用带界面的dll

    用VS + qt 生成dll 和 调用生成的dll 环境: vs 2019 + qt 5.12 创建dll 上一次我们是直接使用的qt 为我们提供方便的类库创建 ,这次呢 我们自己写类库 第一步:创建一个QT应用程序 第二步,修改程序为 生成dll 并且 我修改了生成的所在路径 添加QT的模块 ,自己用了什么,就添加什

    2024年02月03日
    浏览(42)
  • Qt6.5 OneNET Studio 应用API 的安全鉴权token生成算法

    OneNET - 中国移动物联网开放平台 (10086.cn) \\\"文档中心 /OneNET Studio /应用开发 /应用API /安全鉴权\\\" 最近更新时间:2022-02-11 16:44:25 accessKey 用户ID 用户ID 和 accessKey 获取: 先看最终需要生成的结果是什么: 组成部分:中间用\\\"\\\"链接起来 version res userid:实际上就是userid/用户id,若用户

    2024年01月18日
    浏览(34)
  • Qt动态调用(外部调用)SDK库(dll动态库)

    ​​​​​​​  之前的文章,介绍了Qt调用sdk库的方式,大家可以点击查看(Q调用SDK库(dll动态库))之前的文章,里面介绍的调用方式就是静态的调用方式。如下图所示,需要提供.h文件,dll文件和lib文件。  本篇文章主要实现通过一个dll文件,外部动态调用的方式来调用我

    2024年02月09日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包