
第一次在 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 CreatorIDE 本体必装、MinGW如果上面选了 MinGW 套件、CMake、Ninja。Sources可勾可不勾。我建议勾上因为你在 Creator 里按 F1 看某个类的时候能直接翻到源码学起来快得多。这里有个关键点Qt Creator 的版本和你勾的 Qt 库版本是两件事。Creator 是 IDEQt 库是框架一个 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.11Qt 5.12 ~ 5.14高校教材、老项目维护4.12 ~ 4.14Qt 5.15 尾声5.x 项目的主力组合5.x ~ 8.xQt 6.0 ~ Qt 6.56.x LTS 阶段较常见12 及以上Qt 6.6 ~ 6.8新项目、新特性尝鲜注意表里写的是“大致对应”。Qt Creator 是独立发版的它可以加载比它新的 Qt 库也能加载比它旧的。但实践上用太老的 Creator 去开太新的 QtKit 检测、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还是嵌入式设备。编译器GCCMinGW或 MSVC 或 Clang。Qt 版本也就是 qmake 或 CMake 里指向的那个 Qt 安装目录。调试器通常跟着编译器走MinGW 配 gdbMSVC 配 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 ApplicationQML 声明式 UI偏向移动端、嵌入式触屏和现代动效。第一次学无脑选 Widgets。下一步填项目名和路径。项目名建议用英文短名比如HelloQt别用第一个项目这种。路径保持全英文无空格。构建系统这一步老教程会让你选 qmake新版本 Creator 默认给 CMake。这一节我们先走 qmake下一节专门讲 CMake。然后是Class Information页面这是很多人第一次卡住的地方字段含义建议值Class name主窗口类名MainWindowBase class基类QMainWindowGenerate 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.uiXML 格式的界面描述文件双击它就能进 Qt Designer 拖控件。HelloQt.proqmake 的构建脚本。这里要解释一个新手常困惑的点为什么 .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 c17 SOURCES \ main.cpp \ mainwindow.cpp HEADERS \ mainwindow.h FORMS \ mainwindow.uiQT core gui声明用到了 QtCore 和 QtGui 两个模块。第二行的greaterThan(...)是个条件判断意思是“如果 Qt 主版本大于 4就再加上 widgets 模块”因为 Qt5 之后 QWidget 从 QtGui 里拆出来单独成模块了。CONFIG c17是告诉编译器用 C17 标准。如果你想用更新的标准改成c20即可但要确认你的编译器支持。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 改一行代码看见变化项目建好后直接按左下角的绿色三角或 CtrlR构建运行。第一次构建会慢因为要跑 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 默认给 CMakeqmake 是 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::WidgetsQt6 是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 是官方 IDEKit 配置、调试、文档查阅全都开箱即用出问题时排查路径最短。等你对项目结构熟了再用 VS Code 或 VS 去追求你个人的舒适度。5. 第一个项目跑起来之后常见报错与排查实录5.1 编译期报错找不到模块、找不到头文件先说最高频的一类。你写了几行代码一编译满屏红色。常见的几种unknown module(s) in qt: serialportpro 文件少写QT serialport或者 CMake 里少写SerialPort组件。补上就好。如果补上还报去 Qt 安装目录的mkspecs/modules下看看有没有qt_lib_serialport.pri文件没有就说明安装时没勾这个模块得用安装器补装。fatal error: QChart: No such file or directoryQt 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.dllWindows或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: xxxpro/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 按钮、布局与信号槽的三件套第一个项目跑通后别急着去看大项目源码先把手上的小窗口玩透。我的练习路线是这样的第一步往窗口里拖三个按钮然后用垂直布局选中三个控件按 CtrlL把它们排好。你会发现窗口缩放时按钮会自动跟着拉伸——这就是 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 c17或CMAKE_CXX_STANDARD 17写死别依赖默认值。不同的 Qt 版本、不同的编译器默认 C 标准可能不一样代码在本机能编、到同事机器上就报错多半就是这个原因。这种小配置提前定下来能省掉很多“在我这儿明明是好的”的扯皮。