简介:面向需要在Windows x86环境下使用Qt 6.3.0的桌面与应用开发者,这份基于Qt 6.3.0源码、由Visual Studio 2019企业版预编译的32位二进制SDK,能省去自行构建的漫长流程,避免MSVC工具链、依赖库与环境变量反复配置的困扰,下载解压后即可集成到VS或Qt Creator中开始C++/QML混合项目开发。压缩包内共有13606个文件,以h头文件、cmake构建脚本、dll动态库、qml界面描述、lib导入库以及pdb调试符号为主体,其中头文件资源尤为丰富,方便查阅各类接口定义;目录按功能模块划分,查找头文件与链接库都很方便,整体约695MB,是一套较为完整的Win32开发套件。目前已有715人学习下载,适合需要快速搭建Qt x86构建环境、展开Windows 32位软件开发或兼容旧版插件模块的工程师。预编译包覆盖ActiveQt、QtMultimedia、QtQuick3D等常见功能模块,并附带了工具链配置文件与库依赖关系信息,方便对接现有工程,也能在链接错误时快速定位问题。
1. 这活儿到底在做什么:QT6.3.0_x86 项目拆解
先说结论:这个项目不是某个具体产品,而是一套以 Qt 6.3.0 为核心的 x86 架构桌面开发环境。我在最近这两个月里,反复用它搭过三台不同配置的 Windows 开发机,中间踩了不少坑,也把 Qt 官网上那些容易被忽略的细节摸了一遍。这篇东西就是围绕“在 x86 平台上落地 Qt 6.3.0 开发环境”这件事,把从下载、安装、配编译器、建工程,到后面发布程序和排查崩溃的整个流程捋清楚。
1.1 标题里的“6.3.0”和“x86”分别意味着什么
Qt 6.3.0 是 Qt 6 系列里比较特殊的一个版本。它不是 LTS(长期支持版),但补齐了 6.2 LTS 时期不少遗留问题,比如 QML 渲染性能、WebEngine 模块的稳定性、以及高 DPI 缩放表现。对我这种做桌面工具类软件的人来说,6.3.0 比 6.2 的编译速度更快,对新版 CMake 的兼容性也更好。如果你准备从 Qt 5.15 往 Qt 6 迁移,6.3.0 是一个很好的中间站。
“x86”这个词就有意思了。很多人一看到 x86 就以为是 32 位程序,实际上 x86 是英特尔/AMD 处理器最基础的指令集体系,它既包括 32 位的 ia32,也包括 64 位的 x64。日常我们说的“x86 架构”,更多是相对 ARM、MIPS、RISC-V 来说的。Qt 6.3.0 官方提供的离线安装包里,Windows 平台同时有 x86 和 x64 两套编译器目标,我在实际项目里主要是做 64 位的 x86_64 程序,但也会因为客户那边有老机器,额外编一个 32 位版本出来。
1.2 选型逻辑:为什么仍要用桌面版x86
我知道很多人会问:现在不都在搞嵌入式、搞 ARM 吗?为什么还要专门搞 x86 桌面环境?答案是:工业组态、医疗仪器上位机、教育类工具软件,这些行业里大量存量设备依然跑在 x86 的 Windows 或 Linux 桌面上。Qt 在这类场景里的价值不是“能画出界面”,而是它一个 codebase 可以同时覆盖 Windows、Linux、macOS,甚至还能通过交叉编译打到 ARM 板子上。
我这次选 Qt 6.3.0 而不是 Qt 5.15,还考虑了一个因素:Qt 6 的 QML 引擎和渲染管线和硬件加速结合得更好,尤其是在 x86 桌面上跑复杂图表、组态画面时,性能明显比 Qt 5 顺滑。再加上 Qt 6 开始把 CMake 作为官方推荐构建系统,这对我们后期做自动化构建、持续集成非常友好。
1.3 这套环境适合解决什么问题
简单列一下我实际用到这套环境解决的场景:给一个设备厂商做上位机,需要实时显示传感器曲线;给内部工具写一个日志分析器;把一个之前的 Qt 5.15 项目迁移到 Qt 6;给客户做一套带自动更新功能的桌面客户端。这些项目全都跑在 x86 架构的 Windows 10/11 或 Linux 桌面上,也验证了这套环境足够稳。
如果你也是做桌面端应用的开发者、组态软件工程师、或者正在从 Qt 5 往 Qt 6 迁移的老手,这篇文章应该能帮你少走不少弯路。哪怕你是第一次接触 Qt,按我下面的步骤走,也能在 x86 平台上顺利跑起第一个窗口程序。
2. 环境准备与安装实操
2.1 Qt 6.3.0 下载和安装器选择
Qt 官方推荐的方式是使用在线安装器,但现在 Qt 账户登录流程变得越来越繁琐,而且在线安装器在部分网络环境下容易中断。我这边更推荐直接去 Qt 官网的存档页面下载对应版本的离线安装包。6.3.0 版本号的离线包大概有 4GB 多,下载完成后是个可执行文件,双击就能开始安装。
这里你要注意一个点:离线包里可选组件非常全,包括 MSVC 2019 64-bit、MinGW 11.2.0、Qt WebEngine、Qt Charts、Qt Data Visualization 等。安装器默认只勾选一部分,如果你需要图表、3D 可视化这些模块,记得在“Select Components”页面手动勾选。我第一次装的时候就漏了 Qt Charts,后来发现项目里要用 QChart 画曲线,又跑回去补装,浪费了不少时间。
注意:Qt 6.3.0 离线安装包分为 multiple 版本,同一个版本会有不同的编译器套件。选组件时,我建议把“Qt 6.3.0”下面的“MSVC 2019 64-bit”和“MinGW 11.2.0”都勾上,前者用来编译 Windows 原生程序,后者用来做跨编译测试,两者互补,非常实用。
2.2 组件选择:MSVC 还是 MinGW
很多初学者会在 MSVC 和 MinGW 之间纠结。简单说,MSVC 是微软的 Visual Studio 编译器,调试和 Windows API 兼容性最好,生成的程序体积也更小;MinGW 是 GCC 的 Windows 移植版,好处是免费、不需要装庞大的 Visual Studio,而且和 Linux 上的 GCC 行为更接近。
我在 x86 上的主力编译器是 MSVC 2019。原因是我的项目里经常要用到一些 Windows 专属 API,比如注册表操作、服务管理、以及 Crashpad/Breakpad 崩溃转储,这些用 MSVC 编译时更省心。MinGW 我保留了一套,主要用于验证“同一个代码能否在 GCC 下编译通过”,避免以后有同事在 Linux 上接手代码时一堆编译器差异问题。
2.3 开发机的系统准备与 VS 环境核对
这一步非常关键,因为 Qt 6.3.0 在使用 MSVC 套件时,会去自动探测 Visual Studio 的安装路径、SDK 版本和编译器环境。如果你的机器上没装 Visual Studio 2019 或 2022,即便你在 Qt Creator 里选了 MSVC 套件,编译时也会报一个经典错误:
:-1: error: failed to retrieve msvc environment from "C:\Program Files (x86)\Microsoft Visual Studio\Installer\vswhere.exe"
这个问题几乎每个刚从 Qt 5 转 Qt 6 的人都会遇到。解决方法是:先安装 Visual Studio 2019 或 2022,并在“单个组件”里勾选“适用于最新 v142/v143 生成工具的 C++ ATL”和“Windows 10 SDK”。不用装完整的 VS 全家桶,装“使用 C++ 的桌面开发”工作负载就够。我实测下来,VS2022 配合 Qt 6.3.0 完全没有问题,只要 Qt Creator 的套件设置里把编译器指向 VS 安装目录下的cl.exe对应的 vcvarsall 环境即可。
如果你只是用 MinGW 套件,那就跳过 VS 这一大步,前提是安装器里勾选了对应的 MinGW 版本,且系统 PATH 里没有其他 GCC 干扰。
3. 从零创建并运行一个x86目标工程
3.1 在 Qt Creator 中配置编译套件
安装完 Qt 后,打开 Qt Creator,进入“工具 -> 选项 -> Kits”。如果安装过程顺利,Kits 页面会自动识别出几套可用的编译器组合,比如“Desktop Qt 6.3.0 MSVC2019 64bit”“Desktop Qt 6.3.0 MinGW 64-bit”等。
你需要在 Kits 里手动核对三点:
- 编译器:C 和 C++ 编译器路径是否正确指向了安装目录,尤其是 MSVC 的
amd64目录下。 - Qt 版本:qmake 路径是否指向 Qt 6.3.0 的 bin 目录,CMake 工具要手动选一个版本不低于 3.21 的 CMake。
- CMake 生成器:推荐选“Ninja”,不要选默认的“Unix Makefiles”(在 Windows 上会出各种奇怪问题)。Ninja 的并行编译速度明显更快,错误信息也更友好。
我通常在 Kits 页面把“编译输出目录”改成更有语义化的名字,比如build/%{JS: Util.asciify("build-" + Kit::name)},方便多个套件在同一目录下并行编译时不会互相覆盖。这个习惯帮我避免了很多次“编译产物混淆”问题。
3.2 MSVC 环境识别失败的经典坑
如果你用的是 MSVC 套件,并且在编译时遇到“failed to retrieve msvc environment”,十有八九是 Qt Creator 没有找到 VS 的 vswhere 工具。网上有各种改注册表的办法,但我的建议是先检查 VS 安装器是否完整,然后在 Kits 页面的“环境”栏里手动补一行指向 vcvarsall.bat 的路径。
具体操作是:在 Kit 的“Environment”字段里加上INCLUDE、LIB、PATH这三个环境变量,把它们指向 VS 的 VC\Tools\MSVC<版本>\include、lib、bin 目录。这么做虽然有点绕,但能彻底绕过 vswhere 探测失败的问题。
这种手动指定环境的方法,我当时花了一晚上才摸透。你要知道 Qt 在调用 MSVC 编译器时,不是单纯执行 cl.exe,而是要在一个已经初始化好 INCLUDE/LIB 环境的 shell 里去执行。忽略这个细节,后续所有编译都会在头文件搜索阶段崩掉,报一堆“cannot open include file: 'corecrt.h'”之类的错误。
3.3 写一个能弹文件选择框的小程序
环境搞定后,新建一个 Qt Widgets Application 工程,我们来做一个最实用的例子:点按钮弹出文件选择对话框,并读取选中文件的大小和最后修改时间。这是很多工具软件的入门需求,也是之前热搜里“qt弹出对话框选择文件”“qt获取文件信息”两个关键词的落点。
在 Qt 6.3.0 里,代码很简洁:
#include <QApplication> #include <QPushButton> #include <QFileDialog> #include <QFileInfo> #include <QVBoxLayout> #include <QMessageBox> #include <QLabel> int main(int argc, char *argv[]) { QApplication app(argc, argv); QWidget window; QVBoxLayout layout(&window); QLabel label("尚未选择文件"); QPushButton button("选择文件"); QObject::connect(&button, &QPushButton::clicked, [&]() { QString filePath = QFileDialog::getOpenFileName( &window, "选择一个文件", QDir::homePath(), "All Files (*)"); if (filePath.isEmpty()) return; QFileInfo info(filePath); label.setText(QString("文件名: %1\n大小: %2 字节\n修改时间: %3") .arg(info.fileName()) .arg(info.size()) .arg(info.lastModified().toString("yyyy-MM-dd HH:mm:ss"))); }); layout.addWidget(&label); layout.addWidget(&button); window.show(); return app.exec(); }这段代码在 Windows x86 上的表现很稳。QFileDialog::getOpenFileName底层会调用系统的文件选择对话框,和 Windows 资源管理器的体验完全一致,这也是 Qt 在 Windows 平台上的一个天然优势。如果你在 Linux 桌面环境下跑,它会自动切换成 GTK 或原生对话框风格,但要注意如果系统缺 xdg-desktop-portal 组件,可能会回到 Qt 自带的简易对话框样式,功能不受影响,只是观感不同。
4. 编译过程与构建脚本里的细节
4.1 qmake 与 CMake 的选择
在 Qt 6 时代,官方力推 CMake,而且 Qt 6.3.0 自己自带的示例工程大多也已迁移到 CMake。qmake 仍然可用,但官方对它的更新投入在逐步减少。如果你是新项目,建议直接用 CMake;如果你要维护老项目,可以继续用 qmake,这两种方式在 Qt Creator 里都支持。
我用 CMake 写的顶层CMakeLists.txt大致是这样的:
cmake_minimum_required(VERSION 3.21) project(MyTool VERSION 1.0 LANGUAGES CXX) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTORCC ON) set(CMAKE_AUTOUIC ON) find_package(Qt6 REQUIRED COMPONENTS Widgets Charts) qt_add_executable(MyTool main.cpp MainWindow.cpp MainWindow.h ) target_link_libraries(MyTool PRIVATE Qt6::Widgets Qt6::Charts)这里有个关键点:CMAKE_AUTOMOC必须打开,否则 Qt 的信号槽和元对象系统无法正常工作。默认 Qt Creator 生成 CMake 工程时会自动打开,如果你是从旧项目迁移过来,一定要检查这一行有没有被删掉。
4.2 发布软件时需要携带的 Qt 运行库
开发机上跑得好好的程序,拷到别的机器上双击没反应,这是桌面 Qt 开发最经典的“第一次发布噩梦”。Qt 不是静态编译的,你的 exe 依赖于一堆 Qt DLL 和平台插件。
在 Windows 上,我推荐两个工具来解决:
- windeployqt:Qt 自带的部署工具,在 Qt 安装目录的
bin文件夹下。打开一个命令行窗口,进入你的 exe 所在目录,运行"C:\Qt\6.3.0\msvc2019_64\bin\windeployqt.exe" MyTool.exe,它会自动把依赖的 Qt DLL、插件、翻译文件拷贝到当前目录。 - Enigma Virtual Box:如果你希望最终交付给客户的是一个单文件 exe,而不是一堆 DLL 加一个 exe 的文件夹,可以用 Enigma Virtual Box 把目录里的 Qt 运行库全部打包到一个虚拟文件系统里,发布时只有一个主程序文件,干净利落。
我自己的习惯是先用 windeployqt 生成完整目录,确认可以运行后再用 Enigma 打包单文件。这样既能排查缺失的插件,也方便最终交付。
4.3 qxcbconnection失败这类跨平台问题的快速判断
热搜里有一条“qxcbconnection: failed to initialize xrandr qt: xkeyboard extension not present”,这是 Qt 程序在 Linux 桌面上常见的问题。我在自己的 Ubuntu 22.04 机器上也踩过,现象是程序启动时报一堆 xcb 相关的错误,窗口正常弹出来但键盘输入没反应,或者缩放异常。
这类问题的根源多数是系统缺少 Qt xcb 平台插件所需的依赖库。在 x86 架构的 Linux 桌面上,最常用的修复命令是:
sudo apt install libxcb-cursor0 libxkbcommon-x11-0 libxcb-xinerama0 libxcb-randr0其中libxcb-cursor0是 Qt 6 在 Linux 上新增的硬性依赖,缺了它程序会直接崩溃。如果你在更精简的 Linux 系统上跑 Qt,建议把xcb、xkbcommon、xkbcommon-x11、glx相关库全部装上。否则报错信息里那行“xkeyboard extension not present”会一直让你误以为是 X11 配置问题,其实是 Qt 插件依赖缺失。
5. 常见问题排查速查与踩坑心得
5.1 高频报错对照表
这段时间我整理了十几个高频问题,下面这几个最值得记下来。
| 报错信息 | 根本原因 | 处理方法 |
|---|---|---|
failed to retrieve msvc environment | Qt Creator 无法通过 vswhere 定位 VS | 安装 VS2019/2022 C++ 桌面负载,或手动指定 INCLUDE/LIB/PATH |
cannot open include file: 'corecrt.h' | INCLUDE 环境变量缺失 | 在 Kit 的环境字段补齐 VS 的 include 路径 |
qxcbconnection: failed to initialize xrandr | Linux 缺 xcb 相关依赖库 | 安装 libxcb-* 和 libxkbcommon-x11 |
cannot find -lGL | Linux 缺 OpenGL 链接库 | 安装 libgl1-mesa-dev |
| 程序双击无任何反应 | 缺少 Qt 运行库/平台插件 | 使用 windeployqt 部署完整运行目录 |
5.2 几个不容易查到的排错思路
有一个坑特别隐蔽:当 Qt 程序在 Windows 上崩溃,而且你用了QMessageBox或者自定义异常处理,会发现qApp->exec()启动消息循环之后,后续的异常捕获逻辑会失效。热搜里有句话“qcoreapplication::exec() 之后就无法捕获了”,就是这么来的。这不是 Qt 的 bug,而是 Windows 的异常处理机制和 Qt 事件循环在干呕,解决方法是不要用纯try/catch包事件循环,改用 Qt 的qInstallMessageHandler配合 Breakpad 的SetUnhandledExceptionFilter来捕获崩溃。
另外当你从 VS 的解决方案文件打开 Qt 项目时,常遇到“qt 的文件都找不到”。这是因为 VS 需要 Qt VS Tools 插件的“Qt Project”文件类型转换,如果你只安装了 Qt 库而没有安装扩展插件,VS 不会自动识别.ui文件、.qrc文件和.moc文件。装好扩展、把 Qt 版本路径配置好后,现象立刻消失。
5.3 我实际用下来觉得值得养成的习惯
这套 Qt 6.3.0 x86 环境我已经用了一年多,最后分享几个不是文档里会写、但非常实用的经验。
- 第一,一定要把 Qt 安装目录加入系统 PATH,但只加
bin目录,不要加tools目录。否则命令行调试时打qmake或windeployqt会很方便,又不会被 Qt 自带的 Perl、Python 版本干扰。 - 第二,多用 Qt Creator 的“构建目录”隔离策略。同一套源码用 MSVC 和 MinGW 各编译一份,输出目录区分开,能发现很多编译器兼容性问题。
- 第三,遇到 Qt 自带的模块找不到时,先回安装器里看组件是否勾选齐全。Qt Charts、Qt Data Visualization、Qt SerialPort、Qt Network 这些常用模块都不是默认安装,漏一个后面 CMake 就会报
Configuring incomplete。 - 第四,真想在 x86 上发布 32 位程序,要和 64 位分开处理。32 位版本的 exe 放进 64 位系统跑没问题,但依赖的 DLL 也必须是 32 位的,
windeployqt必须用对应编译器目录下的版本,这个细节我在发布一个老客户专用工具时被坑过一次,折腾了一整天才发现。
如果你跟我一样,需要维护多个 Qt 项目和多种编译器环境,我建议把 Qt 版本、VS 版本、CMake 版本的组合固定下来,并且把每个项目的构建套件截图存一份。不要像我之前那样,V 了半个月的系统时间,最后装了一堆不同版本的编译器,反而把 Qt 套件探测搞乱了。
最后再补一个操作层面的小技巧:Qt Creator 里的“工具 -> 外部 -> Qt Designer”可以直接打开.ui文件进行可视化设计,但很多人不知道做组态界面时可以把它和 QGraphicsView 配合使用,先在 Designer 里画好静态控件,再在代码里用 QGraphicsScene 叠加动态元素,这种“双轨制”做法在工业组态场景下特别好用。我在一个设备监控界面里就是用这个思路,既保留了 Designer 的拖拽便利,又保证了动态渲染的灵活性。
本文还有配套的精品资源,点击获取