第一次在 Qt Creator 里点开“文件 → 新建文件或项目”,看到那一整屏模板列表——Application、Library、Non-Qt Project、Other Project——大部分人第一次都会在“Qt Widgets Application”和“Qt Console Application”之间犹豫半天。其实创建一个 Qt 项目本身比你想象中要简单得多,真正容易翻车的地方全在准备工作:装的是哪个版本、用 MinGW 还是 MSVC、安装路径里有没有中文和空格、装的时候漏没漏模块。这篇就把我从零带人入门 Qt 的完整流程摊开来写一遍,包括安装包的选择思路、Qt Creator 与 Qt 库的版本对应关系、新建项目向导里每一个选项到底在干什么、pro 文件和 CMakeLists 怎么逐行读、第一次编译报错时最可能撞上的几种情况以及怎么排查。不管你之前有没有 C++ 项目经验,只要跟着走一遍,半小时内应该能看到自己写的那个窗口跑起来。
1. 开工前的整体思路:为什么新手的第一道坎不是写代码
1.1 把“创建项目”当成一次环境验收
很多人对“创建第一个 Qt 项目”有个误解,以为重点在向导里点几下“下一步”。我带了不下十个新人之后发现,向导本身五分钟就能点完,真正耗时间的是前面那一两天——下载、安装、选 Kit、配编译器。所以我的建议是:把“创建项目”这件事重新定义一遍,它其实是一次环境验收。
什么叫环境验收?就是当你点下“构建并运行”,那个空白窗口能稳定弹出来,并且你改一行代码再点运行,界面上的变化能立刻反映出来。能做到这两点,说明你的 Qt 环境是健康的;做不到,后面写多少代码都是白费力气。这也是为什么我在第一节不急着讲怎么点向导,而是先把安装这件事说清楚。
举个我印象最深的例子。有个同事装完 Qt 之后新建项目,一路默认点完,编译直接报一堆找不到头文件的错。折腾了一下午,最后发现他把 Qt 装在了D:\我的软件\Qt 5.15.2这种带中文又带空格的路径下。qmake 生成 Makefile 的时候路径没做转义,编译器的-I参数直接被空格切成两段。你说这是技术问题吗?不是,这是常识问题,但它就是能让一个新手卡一整天。
注意:Qt 的安装路径、你的项目路径、代码仓库路径,三个都不要出现中文、空格和特殊符号。用
C:\Qt、D:\code这种最朴素的写法,能省掉后面至少三成的玄学报错。
1.2 在线安装器还是离线安装包,怎么选
这是新手问得最多的一个问题,我把结论先放前面,再讲理由。
截至现在,官方对 Windows 平台的主要分发方式是在线安装器(Qt Online Installer)。而历史上最后一个提供完整离线安装包的版本,是Qt 5.14.2。这也是为什么“qt 离线安装包下载 5.14”这个搜索一直有热度——很多人出于网络环境、公司内网、教学统一版本等原因,还是倾向于拿一个装完就不动的离线包。
那到底怎么选?我按场景列一下:
| 你的情况 | 推荐方式 | 理由 |
|---|---|---|
| 个人学习、网络正常 | 在线安装器 | 能按需勾选模块,版本可选范围大 |
| 公司内网、教学机房 | Qt 5.14.2 离线包 | 一次下载多次安装,版本统一可控 |
| 想用 Qt 6 的新特性 | 在线安装器 | Qt 6 系列基本没有完整离线包 |
| 需要长期维护的老项目 | 跟项目版本对齐 | 别用新版本去编译老代码 |
需要强调的是,选 5.14.2 不代表“落后”。Qt 5.14.2 是 5.x 系列里非常成熟的一个版本,语法、API、三方库生态都极其稳定,网上能找到的教程、示例代码绝大多数也能直接跑。对新人来说,“能跑通”比“用最新”重要一百倍。
1.3 在线安装器里到底该勾哪几个
如果你走在线安装器这条路,注册账号之后进入组件选择界面,那个树形列表会让很多人窒息。我给你一个最小可用的清单:
- Qt 版本节点下:选一个具体的版本号,比如
Qt 5.15.2或Qt 6.5.x,然后展开它,至少勾一个编译器套件。Windows 上常见的是MinGW 64-bit和MSVC 2019 64-bit。 - Developer and Designer Tools 节点下:
Qt Creator(IDE 本体,必装)、MinGW(如果上面选了 MinGW 套件)、CMake、Ninja。 - Sources:可勾可不勾。我建议勾上,因为你在 Creator 里按 F1 看某个类的时候,能直接翻到源码,学起来快得多。
这里有个关键点:Qt Creator 的版本和你勾的 Qt 库版本是两件事。Creator 是 IDE,Qt 库是框架,一个 Creator 可以同时管理多个 Qt 版本。很多人搞混这点,以为自己装了 Qt Creator 12,写的代码就是 Qt 12 的语法,其实 Creator 12 只是工具,你的项目到底用哪个 Qt,取决于你在 Kit 里挂的是哪个 qmake。
下载慢怎么办?国内几个高校的开源镜像站长期同步 Qt 的安装包和源码,把安装器里的下载地址替换成镜像即可,速度通常能从几十 KB 提到几 MB。具体做法是在安装器引导阶段就能设置镜像源,或者直接用社区维护的在线安装包,这个搜一下就有,不展开。
2. Qt Creator 与 Qt 库的版本对应:新手最容易踩的第一颗雷
2.1 一张表看懂版本对应关系
先上表,这张表我建议你截图存下来。
| Qt Creator 版本 | 大致对应的 Qt 时代 | 常见使用场景 |
|---|---|---|
| 4.9 ~ 4.11 | Qt 5.12 ~ 5.14 | 高校教材、老项目维护 |
| 4.12 ~ 4.14 | Qt 5.15 尾声 | 5.x 项目的主力组合 |
| 5.x ~ 8.x | Qt 6.0 ~ Qt 6.5 | 6.x LTS 阶段较常见 |
| 12 及以上 | Qt 6.6 ~ 6.8 | 新项目、新特性尝鲜 |
注意表里写的是“大致对应”。Qt Creator 是独立发版的,它可以加载比它新的 Qt 库,也能加载比它旧的。但实践上,用太老的 Creator 去开太新的 Qt,Kit 检测、CMake 支持、调试器适配多少会有点别扭。
2.2 Qt Creator 和 qmake 到底是什么关系
我见过太多人把这两个名字混着叫。简单打个比方:Qt 库是一整套乐高积木,qmake(或 CMake)是施工图纸,Qt Creator 是那间工作台。你可以在工作台上拼积木,也可以换个工作台(比如 VS Code),积木和图纸是不变的。
这个比喻能解释很多现象。比如有人问“我在 Qt Creator 里能跑,为什么命令行里 qmake 找不到?”——因为 Creator 在启动时会自己设置好一套环境变量(PATH、QTDIR、编译器路径等),而你的系统命令行里没有这套东西。再比如“qtcreator 对应 qt 版本”这个搜索一直很热,本质就是大家在想:我这台机器上的工作台,能不能带动我手上这套积木。
答案是可以的,前提是你在 Creator 里把 Kit 配对了。
2.3 Kit 配置:项目能不能编译,全看这一步
Kit 是 Qt Creator 里最核心的概念,翻译过来大概就是“工具链组合包”。一个完整的 Kit 由四部分组成:
- 设备类型:桌面(Desktop)还是嵌入式设备。
- 编译器:GCC(MinGW)或 MSVC 或 Clang。
- Qt 版本:也就是 qmake 或 CMake 里指向的那个 Qt 安装目录。
- 调试器:通常跟着编译器走,MinGW 配 gdb,MSVC 配 cdb。
打开工具 → 选项 → Kits,你会看到一个列表。健康的机器上,列表里应该有几条带绿色小圆点的项,比如Desktop Qt 5.15.2 MinGW 64-bit。如果某一项前面是灰色或红色感叹号,鼠标悬停上去会告诉你缺什么。
提示:Kit 出问题的时候,先看“Qt Versions”那一栏,确认 path 指向的是
.../Qt/5.15.2/mingw81_64/bin/qmake.exe这种完整路径。很多人手滑指向了安装根目录或者 bin 目录,Creator 就识别不出。
2.4 编译器二选一:MinGW 还是 MSVC
这是个老生常谈但永远有人问的问题。我的经验结论是:
- 纯 Qt 项目、跨平台需求、想少踩坑:选 MinGW。它自带 GCC,装完即用,不依赖 Visual Studio。
- 需要调用 Windows 原生 API、要链接 .lib 静态库、要和现有 VS 工程混合:选 MSVC。
两者的 ABI 不兼容,这意味着用 MinGW 编译出来的 dll,不能直接丢给 MSVC 编译的程序用。这一点在做插件、调用第三方库的时候尤其致命。所以选之前想清楚你的项目边界。
还有一个坑:如果你的机器上同时装了多个 Qt 版本、多个编译器,运行时可能会撞上cannot mix incompatible qt library (5.15.3) with this library (5.15.2)这种报错。原因就是你系统 PATH 里同时存在两个 Qt 的 bin 目录,程序加载 dll 的时候抓错了。解决办法是把不需要的那个 Qt 的 bin 路径从系统环境变量里删掉,或者在 Creator 的 Kit 里把环境变量覆盖掉。
3. 手把手:用 qmake 创建你的第一个 Qt Widgets 项目
3.1 新建项目向导的每一步都在做什么
打开 Qt Creator,文件 → 新建文件或项目,左侧选Application (Qt),右侧选Qt Widgets Application。这里三个模板的区别值得说清楚:
- Qt Widgets Application:传统桌面 GUI,控件式开发,最主流。
- Qt Console Application:没有界面的控制台程序,用来测试纯逻辑。
- Qt Quick Application:QML 声明式 UI,偏向移动端、嵌入式触屏和现代动效。
第一次学,无脑选 Widgets。
下一步填项目名和路径。项目名建议用英文短名,比如HelloQt,别用第一个项目这种。路径保持全英文无空格。构建系统这一步,老教程会让你选 qmake,新版本 Creator 默认给 CMake。这一节我们先走 qmake,下一节专门讲 CMake。
然后是Class Information页面,这是很多人第一次卡住的地方:
| 字段 | 含义 | 建议值 |
|---|---|---|
| Class name | 主窗口类名 | MainWindow |
| Base class | 基类 | QMainWindow |
| Generate form | 是否生成 .ui 设计文件 | 勾上 |
| Header file | 头文件名 | 自动 |
| Source file | 源文件名 | 自动 |
基类三选一:QMainWindow带菜单栏状态栏,适合主窗口;QWidget最轻,适合弹窗和自定义控件;QDialog是对话框基类。第一次练手选QMainWindow就行,功能全,后面想加菜单栏不用改基类。
3.2 生成出来的文件都是干什么的
点完成后,项目树里会出现这么几个文件:
HelloQt/ ├── HelloQt.pro ├── main.cpp ├── mainwindow.h ├── mainwindow.cpp └── mainwindow.uimain.cpp:程序入口。里面有QApplication a(argc, argv);和MainWindow w; w.show(); return a.exec();这四行是 Qt 程序的骨架。mainwindow.h:主窗口类声明,Ui::MainWindow *ui;这个指针是关键。mainwindow.cpp:构造函数里那句ui->setupUi(this);把 .ui 文件描述的所有控件挂到窗口上。mainwindow.ui:XML 格式的界面描述文件,双击它就能进 Qt Designer 拖控件。HelloQt.pro:qmake 的构建脚本。
这里要解释一个新手常困惑的点:为什么 .ui 文件能变成代码?因为构建过程中有个叫uic的工具,会把 .ui 编译成一个ui_mainwindow.h,放在构建目录里。你在mainwindow.cpp里#include "ui_mainwindow.h"拿到的就是这个自动生成的文件。所以你在 Designer 里拖的控件,实际上是通过ui->pushButton这种指针访问的。
3.3 pro 文件逐行拆解
打开HelloQt.pro,内容大概是这样的:
QT += core gui greaterThan(QT_MAJOR_VERSION, 4): QT += widgets CONFIG += c++17 SOURCES += \ main.cpp \ mainwindow.cpp HEADERS += \ mainwindow.h FORMS += \ mainwindow.uiQT += core gui声明用到了 QtCore 和 QtGui 两个模块。第二行的greaterThan(...)是个条件判断,意思是“如果 Qt 主版本大于 4,就再加上 widgets 模块”,因为 Qt5 之后 QWidget 从 QtGui 里拆出来单独成模块了。
CONFIG += c++17是告诉编译器用 C++17 标准。如果你想用更新的标准,改成c++20即可,但要确认你的编译器支持。
SOURCES / HEADERS / FORMS就是字面意思。注意这里没有手动列出依赖的头文件路径,因为 Qt 的模块已经替你配好了。
模块漏声明是新手最常见的坑之一。比如你想用串口,写了#include <QSerialPort>,然后编译报unknown module(s) in qt: serialport。原因就是 pro 文件里没有QT += serialport。同理,想用网络加QT += network,想用图表加QT += charts,想用 SQL 加QT += sql。
注意:报错信息里如果出现
unknown module(s) in qt: xxx,先别怀疑版本问题,九成是 pro 文件里少写了一行QT += xxx。少部分情况是安装时没勾选对应模块,那就得重新跑安装器补装。
3.4 改一行代码,看见变化
项目建好后直接按左下角的绿色三角(或 Ctrl+R)构建运行。第一次构建会慢,因为要跑 moc、uic、rcc 这些预处理工具。成功的话会弹出一个空白窗口,标题是项目名。
现在动手做个最小的改动,验证整条链路是通的。双击mainwindow.ui进入设计器,从左侧控件箱拖一个Push Button和一个Label到窗口上。然后右键按钮,选转到槽,选clicked(),Creator 会自动在mainwindow.cpp里生成一个槽函数:
void MainWindow::on_pushButton_clicked() { ui->label->setText("你好,Qt"); }保存,重新运行,点按钮,标签文字变了。恭喜,你的第一个交互式 Qt 项目跑通了。这个“转到槽”的机制是 Qt 信号槽体系的入门入口,后面所有复杂的界面交互都是从这里延伸出去的。
4. 换用 CMake 创建项目:现在更值得学的方式
4.1 为什么新版本 Creator 默认给 CMake
qmake 是 Qt 自家的构建工具,用了十几年,足够好。但整个 C++ 生态在过去几年快速向 CMake 靠拢,加上 Qt 6 官方明确把 CMake 作为一等公民,新建项目默认给 CMake 就顺理成章了。
对你个人来说,学 CMake 的实际收益是:同一个项目能被更多编辑器打开。你可以在 Qt Creator 里写,也可以用 VS Code 打开,甚至用 Visual Studio 2026 直接打开 CMake 工程,都能编译运行。这在团队协作里非常值钱。
4.2 CMakeLists 逐段说明
用 CMake 方式新建一个 Qt Widgets 项目,生成的CMakeLists.txt大致是这样:
cmake_minimum_required(VERSION 3.16) project(HelloQt 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) add_executable(HelloQt main.cpp mainwindow.cpp mainwindow.h mainwindow.ui ) target_link_libraries(HelloQt PRIVATE Qt6::Widgets)我逐段解释一下。前三行是模板化的:指定 CMake 最低版本、声明项目名和语言。
接下来三个AUTOMOC / AUTORCC / AUTOUIC是 Qt 特有的:moc处理带Q_OBJECT宏的头文件生成元对象代码,rcc把 .qrc 资源文件编译进去,uic把 .ui 转成头文件。这三个开关必须打开,否则你会遇到“信号槽连不上”“资源里的图片找不到”“ui 指针是空”等一堆诡异现象。
find_package那行是找 Qt。如果你用的是 Qt 5,要改成:
find_package(Qt5 REQUIRED COMPONENTS Widgets) target_link_libraries(HelloQt PRIVATE Qt5::Widgets)注意命名空间的区别,Qt5 是Qt5::Widgets,Qt6 是Qt6::Widgets。这一点在你在网上抄旧代码的时候要特别留意,抄错命名空间,CMake 配置阶段就直接报错。
要加模块也是同样的套路。想用串口:
find_package(Qt6 REQUIRED COMPONENTS Widgets SerialPort) target_link_libraries(HelloQt PRIVATE Qt6::Widgets Qt6::SerialPort)4.3 在 VS Code 和 Visual Studio 里打开 Qt 项目
聊到 CMake 就顺带说说别的编辑器怎么玩,因为这直接关系你选 CMake 的收益。
VS Code 方案:装三个扩展——C/C++、CMake Tools、Qt 官方或社区的 Qt 扩展。然后在settings.json里手工填qmake路径,Creator 能自动识别的 Designer,在 VS Code 里要靠配置才能让 .ui 文件用 Designer 打开。这条路能走通,但初始配置要花点时间,适合已经熟悉 VS Code 的人。
Visual Studio 方案:VS 对 CMake 的支持现在相当完整,直接打开 CMakeLists 所在文件夹就能构建。但如果你不是走 CMake 而是想在 VS 里用 Qt 的 VS 插件(Qt VS Tools),那流程是老一套:装扩展、配置 Qt 版本、新建 Qt 项目。顺带说一句,很多人在这个流程里会遇到 “register at least one Qt version” 的提示,意思就是 VS 里还没登记任何一个 Qt 安装,去 Qt VS Tools 的选项里把 qmake 路径加进去就行。
不管用哪个编辑器,我的建议是:先把 Qt Creator 走通,再换编辑器。Creator 是官方 IDE,Kit 配置、调试、文档查阅全都开箱即用,出问题时排查路径最短。等你对项目结构熟了,再用 VS Code 或 VS 去追求你个人的舒适度。
5. 第一个项目跑起来之后:常见报错与排查实录
5.1 编译期报错:找不到模块、找不到头文件
先说最高频的一类。你写了几行代码,一编译,满屏红色。常见的几种:
unknown module(s) in qt: serialport:pro 文件少写QT += serialport,或者 CMake 里少写SerialPort组件。补上就好。如果补上还报,去 Qt 安装目录的mkspecs/modules下看看有没有qt_lib_serialport.pri文件,没有就说明安装时没勾这个模块,得用安装器补装。
fatal error: QChart: No such file or directory:Qt Charts 是独立模块,同样要加QT += charts。另外提醒一句,Charts 模块在开源授权下是 GPLv3 而非 LGPL,如果你的项目是闭源商业软件,这块授权要提前想清楚,别到发布时才想起来。
找不到ui_mainwindow.h:这是构建中间产物,不在源码目录里,而在构建目录的ui_xxx.h路径下。正常情况下 qmake/CMake 会自动加进 include 路径,如果报找不到,通常是构建目录被搞乱了,删掉构建目录重新构建。
5.2 运行期报错:程序起不来或者一闪而过
cannot mix incompatible qt library:前面提过,PATH 里有多个 Qt 版本。排查方法是打开命令行敲where Qt5Core.dll(Windows)或ldd 你的可执行文件(Linux),看它到底加载了哪个。删掉冲突的 PATH 条目。
双击 exe 提示缺少 dll:在 Creator 里能跑、拷出去就跑不了,这是发布问题,不是代码问题。因为你机器上的 Qt dll 是通过 PATH 找到的,别人机器上没有。解决办法是用 Qt 自带的windeployqt把依赖拷过去:
windeployqt --release HelloQt.exe它会自动分析依赖,把 Qt5Core.dll、Qt5Gui.dll、Qt5Widgets.dll 以及 platforms 插件目录一起复制过来。注意platforms/qwindows.dll这个文件必须存在,缺了它程序会直接报“无法初始化平台插件”然后退出。
中文乱码:Qt 5 时代的老问题。源码文件是 UTF-8,但 MSVC 默认按 GBK 读,于是字符串字面量全乱。三种解法:一是源码保存为 UTF-8 with BOM;二是在 pro 文件里给 MSVC 加/utf-8编译参数:
msvc { QMAKE_CXXFLAGS += /utf-8 }三是统一用QStringLiteral("中文")或tr("中文")包起来。Qt 6 默认源文件按 UTF-8 处理,这个问题基本消失,这也是我推荐新人直接上 Qt 6 的一个小理由。
5.3 常见问题速查表
把上面这些整理成一张表,方便你出问题时直接对照。
| 现象 | 大概率原因 | 处理方式 |
|---|---|---|
| unknown module(s) in qt: xxx | pro/CMake 没声明模块 | 补QT += xxx或find_package组件 |
| 找不到 Qt 头文件 | Kit 没配对,Qt 版本路径错 | 检查 Kits 里的 qmake 路径 |
| 信号槽连不上没反应 | 忘开 AUTOMOC 或类里漏 Q_OBJECT | 打开开关,检查宏 |
| 界面控件为空指针 | 忘调 setupUi 或 AUTOUIC 没开 | 检查构造函数和 CMake 开关 |
| 拷到别的机器启动失败 | 缺 dll 和平台插件 | 用 windeployqt 部署 |
| cannot mix incompatible qt library | 环境变量里有多个 Qt | 清理 PATH 中重复项 |
| 中文显示为乱码 | 编码不一致 | 加 /utf-8 或用 QStringLiteral |
这张表我建议你贴在显示器边上。新手遇到的 80% 问题都在这七行里,剩下 20% 才需要真正去翻文档。
提示:遇到报错先看第一条,不要被后面的几十条连带错误干扰。C++ 的报错有很强的传染性,一个头文件找不到能衍生出几十行错误,修好第一个,后面往往自己就消失了。
6. 从第一个项目出发:几个能立刻上手的小练习
6.1 按钮、布局与信号槽的三件套
第一个项目跑通后,别急着去看大项目源码,先把手上的小窗口玩透。我的练习路线是这样的:
第一步,往窗口里拖三个按钮,然后用垂直布局(选中三个控件按 Ctrl+L)把它们排好。你会发现窗口缩放时按钮会自动跟着拉伸——这就是 Qt 布局系统的价值,它在替你处理坐标计算。手工 setGeometry 是新手最容易走进的死胡同,一旦用了布局,位置这件事就交给框架了。
第二步,给每个按钮连一个槽,分别做三件事:改标签文字、弹一个QMessageBox、切换窗口标题。三件事都涉及信号槽和 Qt 的基本类,练完基本就熟了。
第三步,加一个菜单栏和状态栏。QMainWindow自带这两个,在 Designer 里直接双击顶部就能编辑。状态栏里statusBar()->showMessage("就绪");是最经典的用法。
6.2 用 QChart 画一条会动的曲线
图表是 Qt 桌面开发里非常高频的需求,尤其是做上位机、监控软件、数据采集的时候。QChart 是官方方案,用起来直观:
QSplineSeries *series = new QSplineSeries(); series->append(0, 6); series->append(2, 4); series->append(3, 8); QChart *chart = new QChart(); chart->addSeries(series); chart->createDefaultAxes(); chart->setTitle("示例曲线"); QChartView *view = new QChartView(chart); view->setRenderHint(QPainter::Antialiasing); setCentralWidget(view);代码不长,但这里有个性能大坑,我必须单独说。如果你把上面这段写在一个每秒执行几十次的定时器里,程序很快就卡死。原因是每次addSeries都重新创建对象、重算坐标轴,开销极大。正确的做法是只创建一次series 和 chart,之后用series->replace()或者series->clear()配合批量append来更新数据。
再进一步,如果数据刷新频率很高(比如每秒上百个点),绘图这件事不要放在主线程做。信号采集放子线程,通过信号槽把一批数据发回主线程,主线程只负责更新图表。这是 Qt 里最经典的生产者消费者模型。要注意的是,QChart 相关的对象只能在 GUI 线程操作,子线程里碰它基本会崩。
那 QChart 性能到底够不够用?我的实测经验是:几百个点、每秒刷新几次,QChart 完全够。上万点高频刷新就需要考虑 QCustomPlot 或者直接用 QPainter 自绘了。这三者的取舍大致是:QChart 官方维护、API 友好但渲染开销大;QCustomPlot 单文件、性能好、社区活跃;自绘最灵活最快,但什么都得自己写,坐标轴、缩放、图例全是活。
6.3 串口、文件与 JSON:三个绕不开的基础能力
第一个项目之后,我建议按这个顺序补齐三项能力,因为它们组合起来能覆盖非常多真实需求。
串口。用QSerialPort,核心流程就四步:枚举可用端口、打开并配置波特率数据位停止位、连readyRead信号读数据、用完close。这套东西做数据采集、仪器控制、传感器通信都用得上。举个具体场景,用 CH341 那类 USB 转 I2C/SPI 的模块做收发实验时,PC 端其实就是把它当一个串口设备,按模块约定的协议拼命令帧发下去,再解析返回帧。难点从来不在 Qt,而在协议解析:帧头帧尾怎么定、校验和怎么算、粘包怎么拆。我的做法是收数据先进一个QByteArray缓冲区,然后循环匹配帧头、判断长度是否满足、够了就切一帧出来解析,不够就等下一次readyRead。
文件与目录。QFileInfo拿文件大小、修改时间、后缀名,QDir做遍历和筛选,QFile读写内容。做一个小工具,扫描指定目录下所有图片并按日期分组,这个练习做完,文件系统这块基本就通了。
JSON。QJsonDocument、QJsonObject、QJsonArray三件套。读的时候先QJsonDocument::fromJson再逐层取;写的时候反过来组装再toJson。配置文件的保存、跟后端接口对接,全靠这个。
6.4 打包发布:让程序能离开你的电脑
本地能跑不等于能交付。发布环节我踩过的坑比开发环节还多,说两个最关键的。
第一,用 Release 模式构建,别拿 Debug 的 exe 去发布。Debug 版依赖调试运行库,体积大、速度慢,别人机器上大概率还缺库。
第二,必须用 windeployqt。手工拷 dll 是行不通的,因为依赖是层层嵌套的,少一个插件就白搭。命令很简单:
windeployqt --release --no-translations HelloQt.exe--no-translations可以去掉一堆用不上的语言包,减小体积。跑完之后你会看到一个 platforms 目录、一堆 dll 和几个插件目录,整个文件夹拷给别人就能双击运行。
如果你还想再进一步,可以把这些文件和 exe 一起打成安装包。工具用什么的都有,选一个顺手的就行,核心思路都是把一个自包含的目录压成一个可安装文件。
7. 我在带人过程中总结的几条经验
先说一条最反直觉的:别急着追新版本。我见过太多人卡在“装最新版 Qt 结果第三方库全不兼容”的循环里。先用一个成熟稳定的版本把项目跑通、把概念学明白,等你真正遇到旧版本的局限了,再升级。到那时候你已经有能力自己判断值不值得升级了。
再说一条关于学习路径的:不要一上来就啃大项目源码。Qt 的示例代码质量很高,Creator 的欢迎页里就有一大堆,从Application Example到Chart Example都有。我的建议是按“一个小功能一个小功能”地拆着做,做完一个就跑一次,看到效果再往下。这样每一行代码你都知道它为什么在那里。
最后说一个我自己吃了亏的点:把构建目录当成一次性产物。Qt 的构建目录里全是自动生成的文件,moc 生成的、uic 生成的、中间对象文件,这些都不该进版本控制。项目一旦出现莫名其妙的编译错误,第一件事就是删掉构建目录重新构建,这一步能治好一半的“玄学问题”。我现在的习惯是构建目录永远放在源码目录之外,源码目录干干净净只有源文件、pro/CMakeLists 和资源,出问题时心里有底。
还有一个很小但很实用的习惯:在 pro 或 CMakeLists 里就把CONFIG += c++17或CMAKE_CXX_STANDARD 17写死,别依赖默认值。不同的 Qt 版本、不同的编译器,默认 C++ 标准可能不一样,代码在本机能编、到同事机器上就报错,多半就是这个原因。这种小配置提前定下来,能省掉很多“在我这儿明明是好的”的扯皮。