简介:这是一份面向Qt初学者与进阶开发者的系统性学习资料,聚焦Qt5框架核心机制与Qt Creator实战开发,解决跨平台GUI应用从环境搭建到工程落地的全流程学习痛点。资源为单文件PDF格式,共1个5.79MB的高清整理版电子书,内容覆盖基础语法、信号槽新旧语法对比、MainWindow构建、布局管理、菜单/工具栏/状态栏定制、标准与自定义对话框、事件处理(含事件过滤器、自定义事件)、多线程、国际化及数据库集成等94章完整知识链,结构清晰、循序渐进,每章均配有可直接复现的代码示例与原理剖析。该版本在豆子原博客79章基础上,独家补全2016年3月后更新的80–94章内容,涵盖Qt5深度特性与工程实践要点,是目前CSDN上最完整的《Qt学习之路2》整合版。已有871人学习下载,适合希望扎实掌握Qt底层机制并快速投入实际项目开发的开发者。
1. Qt 是什么?别被“跨平台 GUI 框架”吓住,它其实是个帮你少写 80% 重复代码的「桌面应用组装包」
你有没有试过:想做个带按钮、输入框、能存文件的小工具,结果光是让窗口在 Windows 上弹出来,就卡在编译报错上?查半天发现要装 MinGW、配环境变量、改 .pro 文件……最后连“Hello World”都没跑出来,人已经麻了。
Qt 就是来解决这个“麻”的。
它不是一门语言,也不是一个命令行工具,而是一整套已经写好、反复验证过、能直接拼装的 C++ 零件箱——里面有现成的按钮(QPushButton)、文本框(QLineEdit)、菜单栏(QMenuBar)、文件对话框(QFileDialog),甚至还有画图板(QPainter)、数据库连接(QSqlDatabase)、网络请求(QNetworkAccessManager)……你不用从零造轮子,只要告诉它“我要一个点击后弹出保存窗口的按钮”,它就真给你一个能点、能存、能跨 Windows/macOS/Linux 运行的按钮。
更关键的是,它用一套统一的写法,自动适配不同系统:你在代码里写QMessageBox::information(this, "提示", "保存成功"),在 Windows 上它弹原生风格的蓝底白字窗口,在 macOS 上自动变成圆角毛玻璃风,在 Linux 上也长得像本地程序——你完全不用操心底层怎么画、字体怎么调、按钮阴影怎么加。
所以,如果你的目标是:
✅ 快速做出一个有界面、能交互、能读写文件/联网/画图的桌面小工具;
✅ 不想被 Win32 API、Cocoa、GTK 的差异绕晕;
✅ 愿意学一点 C++(但不强求精通模板元编程);
那 Qt 就不是“可选项”,而是目前对新手最友好的「第一块桌面开发踏板」。
这份《Qt 学习之路2-2020整理版》PDF,就是一位实战派开发者(大家叫他“豆子”)把 94 个核心知识点,按“先让你跑起来 → 再教你稳住 → 最后带你扩展”的节奏,掰开揉碎喂到你嘴边的教程。它不讲虚的架构哲学,只教你怎么在 Qt Creator 里点几下、敲几行,就把一个真正能用的小程序做出来。
2. 为什么现在学 Qt?不是为了“学框架”,而是为了抢回“做东西”的掌控感
2.1 别再被“前端/后端/移动端”标签困住:桌面才是你最该先拿下的主战场
很多新人一上来就被“学 Python 还是 JavaScript?”“该卷 React 还是 Flutter?”带偏,但现实是:90% 的日常需求,根本不需要网页或手机 App。
比如:
- 财务同事想批量重命名几百张发票截图,加个日期前缀;
- 实验室老师要实时显示传感器数据曲线,顺便导出 Excel;
- 设计师需要一个内部小工具,把 PSD 图层名一键转成 JSON 配置;
这些需求,写个网页?得搭服务器、配域名、处理跨域、兼容浏览器……写个 App?上架审核、证书签名、iOS 审核周期……而用 Qt,你只需要:
① 打开 Qt Creator → 新建项目 → 选“Application” → 勾“GUI Application”;
② 拖一个QLabel(标签)和一个QPushButton(按钮)到界面上;
③ 双击按钮,写两行代码:
void MainWindow::on_pushButton_clicked() { ui->label->setText("你好,世界!"); }→ 点“运行”按钮,一个带按钮和文字的窗口就弹出来了。整个过程 3 分钟,不依赖网络、不需部署、双击就能运行。
这就是 Qt 给你的“掌控感”:你写的每一行代码,都直接对应屏幕上一个看得见、摸得着的元素,没有中间商,没有黑匣子。
2.2 Qt Creator 不是 IDE,而是你的“可视化翻译官”
很多人怕 Qt,其实是怕“C++ 太难”“编译太复杂”。但 Qt Creator 已经把最难的部分藏起来了。
它不是 Visual Studio 那种“全手动配置编译器+链接库+头文件路径”的硬核环境,而是一个专为 Qt 优化的“所见即所得”工作台:
- 你拖一个按钮到设计界面(
.ui文件),它自动生成对应的 C++ 对象声明(QPushButton *pushButton;); - 你右键按钮 → “转到槽”,它自动在代码里生成
on_pushButton_clicked()函数框架; - 你改
.ui文件里的按钮文字,保存后运行,界面上立刻变——不用重新编译整个项目; - 它内置了 Qt Assistant(离线文档),光标停在
QFileDialog上按 F1,立刻弹出完整用法、参数说明、示例代码。
换句话说:Qt Creator 把“写代码”和“做界面”这两件事,拧成了一个动作。你不用先学完 C++ 再学 Qt,而是边拖控件、边看代码、边理解逻辑,像搭乐高一样把功能一块块拼起来。
2.3 为什么是 Qt5,而不是 Qt6 或 Qt4?
你可能看到网上有人说“Qt6 更现代”“Qt4 兼容老项目”,但对零基础新手,Qt5 是唯一理性选择:
- 生态最稳:99% 的中文教程、Stack Overflow 问题、开源项目(包括这份《学习之路2》)都基于 Qt5;
- 文档最全:Qt 官方文档中,Qt5 的每个类都有 3~5 个完整示例,Qt6 部分新类连示例都还没补全;
- 工具链最成熟:Qt Creator 对 Qt5 的支持已打磨 10 年,新建项目、调试、UI 编辑几乎零报错;Qt6 的某些新特性(如 CMake 默认构建)反而会让新手在第一步就卡在“找不到 qmake”上;
- 学习曲线最平:Qt5 的信号槽语法(
connect(btn, &QPushButton::clicked, this, &MainWindow::onBtnClick))清晰直白;Qt6 引入的函数指针式写法虽然更 C++ 化,但对没接触过std::function的新手,第一眼就是天书。
提示:这份 PDF 教程虽名为“Qt 学习之路2”,内容主体是 Qt5,但会明确标注哪些是 Qt4/Qt5 差异(比如第 16 章“深入 Qt5 信号槽新语法”),不会让你踩版本混淆的坑。它不鼓吹“最新即最好”,而是告诉你:“先用 Qt5 站稳,再看 Qt6 有什么值得升级”。
3. 第一步:5 分钟跑通第一个 Qt 程序(含避坑指南)
3.1 下载安装:只装这 3 个东西,别多装、别乱选
去官网(https://www.qt.io/download)下载Qt Online Installer(在线安装器),这是目前最省心的方式。安装时只勾选以下三项(其他全部取消!):
- ✅Qt 5.15.2(或你看到的最新 Qt5 版本,不要选 Qt6)
- ✅MinGW 11.2 64-bit(Windows 用户) /macOS clang 64-bit(Mac 用户) /Desktop GCC 64-bit(Linux 用户)
- ✅Qt Creator 11.0.x(最新稳定版)
注意:安装路径不要包含中文、空格、特殊符号!例如
D:\Qt\可以,D:\我的软件\Qt\或C:\Program Files\Qt\会导致后续编译失败。这是新手翻车率最高的第一步。
3.2 创建项目:跟着这 4 步走,不点错任何地方
- 打开 Qt Creator → 点左上角File → New File or Project;
- 左侧选Application → Qt Widgets Application→ 点Choose...;
- 项目名称填
HelloQt(不要用中文、不要带空格),路径选你刚才确认的纯英文路径(如D:\QtProjects\HelloQt); - Kit 选择页:勾选你刚装的Desktop Qt 5.15.2 MinGW 64-bit(Windows)或对应编译器 → 点Next → Next → Finish。
此时,Qt Creator 会自动生成一个完整项目,包含:
mainwindow.ui(可视化界面文件)mainwindow.h(类声明)mainwindow.cpp(类实现)main.cpp(程序入口)
3.3 改界面:拖一个按钮,改一行文字
- 在左侧Edit模式下,双击打开
mainwindow.ui; - 右侧Widget Box(部件盒)里找到Buttons → Push Button,拖到中央空白处;
- 选中按钮 → 右侧Property Editor(属性编辑器)里找到
text属性 → 把默认的PushButton改成点我打招呼; - 保存(Ctrl+S)。
3.4 写代码:3 行搞定“点击弹窗”
- 保持
mainwindow.ui打开状态 → 右键按钮 → 选Go to slot...; - 在弹出窗口中选
clicked()→ 点OK; - 自动跳转到
mainwindow.cpp,光标停在void MainWindow::on_pushButton_clicked()函数内; - 在
{ }之间输入这 3 行:
QMessageBox msgBox; msgBox.setWindowTitle("问候"); msgBox.setText("你好,世界!这是你的第一个 Qt 程序。"); msgBox.exec();解释:
QMessageBox是 Qt 提供的“标准对话框”类,专门用来弹提示、警告、确认窗口;setWindowTitle()设置弹窗顶部标题栏文字;setText()设置弹窗中间的主内容文字;exec()是关键!它让弹窗“模态显示”(即用户必须关掉它才能操作主窗口),没有这行,窗口一闪就没了。
3.5 运行:见证奇迹的时刻
点 Qt Creator 左下角绿色三角形Run按钮(或 Ctrl+R)。
→ 等几秒,一个带标题栏的窗口弹出,上面有个“点我打招呼”按钮;
→ 点击它,一个蓝底白字的弹窗出现,写着“你好,世界!这是你的第一个 Qt 程序。”;
→ 点“OK”,弹窗关闭,主窗口还在。
恭喜!你已完成 Qt 开发的“登月第一步”:从零到可运行、可交互、跨平台的桌面程序,全程 5 分钟,无任何报错。
4. 新手必踩的 5 个坑:血泪经验总结,照着改立马不翻车
4.1 现象:点击按钮后,弹窗一闪而逝,或者根本没反应
原因:漏写了exec(),或者误用了show()(show()是非模态,不阻塞代码执行,弹窗后程序继续往下跑,瞬间结束)
解决:
- 确保弹窗代码末尾是
msgBox.exec();(注意分号); - 如果要用
show()(比如做悬浮提示),必须在main.cpp的QApplication a(argc, argv);后加a.exec();保持事件循环,否则窗口创建后立即销毁。
4.2 现象:编译报错undefined reference to 'vtable for MainWindow'
原因:mainwindow.h中声明了信号或槽,但moc(Qt 元对象编译器)没生成对应代码,通常因为:
① 类声明里没写Q_OBJECT宏;
② 修改了.h文件后没重新运行 qmake(Qt Creator 一般自动触发,但有时卡住)。
解决:
- 打开
mainwindow.h,确认class MainWindow : public QMainWindow下一行是Q_OBJECT; - 右键项目名 →Run qmake;
- 清理并重建:菜单Build → Clean All→Build → Rebuild All。
4.3 现象:中文显示为方块(□□□)或乱码
原因:Qt 默认编码是 UTF-8,但 Windows 控制台/部分字体不支持,或源文件保存编码不是 UTF-8 without BOM。
解决:
- 在
main.cpp的int main(int argc, char *argv[])函数开头,QApplication a(argc, argv);之前,加两行:
QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8")); QApplication::setAttribute(Qt::AA_EnableHighDpiScaling);- 用记事本另存
mainwindow.cpp时,选择“编码:UTF-8”(不要选 UTF-8 with BOM); - 在 Qt Creator 中,右下角状态栏点击编码(如
System),选UTF-8。
4.4 现象:拖进来的按钮点击没反应,Go to slot选项是灰色的
原因:按钮没被正确“提升”为QPushButton,或 UI 文件未保存导致信号未绑定。
解决:
- 选中按钮 → 右侧属性编辑器检查
objectName是否为空,如果是,手动填pushButton(与on_pushButton_clicked中的名字一致); - 确保
mainwindow.ui已保存(Ctrl+S),且mainwindow.h中private slots:下有void on_pushButton_clicked();声明; - 如果仍无效,右键按钮 →Change signal/slot connection→ 手动连接
clicked()到on_pushButton_clicked。
4.5 现象:运行时报错The program has unexpectedly finished.或闪退
原因:最常见于访问了空指针,比如ui->label->setText(...)但界面上根本没放QLabel;或QFile打开失败后没检查file.isOpen()就直接读写。
解决:
- 所有
ui->xxx操作前,先确认xxx控件已拖入 UI 并设置了objectName; - 文件/网络操作后,务必检查返回值:
QFile file("data.txt"); if (!file.open(QIODevice::ReadOnly)) { QMessageBox::warning(this, "错误", "无法打开文件:" + file.errorString()); return; } // 后续读取操作...5. 从“能跑”到“能用”:接下来该学哪 3 个模块?(附学习路径表)
跑通第一个程序只是热身,真正的 Qt 开发能力,体现在你能用它解决实际问题。根据这份《Qt 学习之路2》的 94 章结构和大量新手实践反馈,我为你划出一条零基础 30 天可落地的学习路径——不求全,只抓最常用来“做东西”的核心模块,每一步都对应一个真实小任务:
| 阶段 | 核心模块(对应 PDF 章节) | 你要做的小任务 | 学完你能做什么 |
|---|---|---|---|
| 第 1 周:界面搭建 + 数据交互 | 第 4 章 信号槽 第 7 章 MainWindow 第 11 章 布局管理器 第 12 章 菜单栏/工具栏 第 13-15 章 对话框 | 做一个“简易计算器”: • 用 QGridLayout排列 0-9 数字按钮和+ - × ÷ =按钮• 点击数字按钮,文字追加到 QLineEdit显示区• 点击 =,用QMessageBox显示计算结果 | 独立完成带布局、多按钮、数据传递的完整界面,告别“只会弹窗” |
| 第 2 周:文件 + 数据持久化 | 第 35-37 章 文件读写 第 41-42 章 model/view 架构 第 44 章 QFileSystemModel 第 55-57 章 数据库操作 | 做一个“待办事项清单”: • 用 QListWidget显示任务列表• 点击“添加”按钮,弹 QInputDialog输入任务名,追加到列表• 点击任务项,用 QMessageBox::question询问是否删除• 关闭程序前,自动将列表保存到 tasks.txt;启动时自动加载 | 让程序记住用户数据,不再每次重启都清空,迈出“实用工具”第一步 |
| 第 3 周:绘图 + 网络基础 | 第 24-29 章 Qt 绘制系统 第 65-67 章 访问网络(1-3) | 做一个“天气简报小工具”: • 用 QPainter在QWidget上绘制温度计图形(竖条+刻度+红色水银柱)• 点击“刷新”按钮,用 QNetworkAccessManager请求公开天气 API(如http://api.openweathermap.org/data/2.5/weather?q=Beijing&appid=xxx)• 解析返回的 JSON(第 63-64 章),提取温度值,更新温度计水银柱高度和 QLabel文字 | 跨出本地,连接真实世界数据,并用自定义图形直观呈现,技能树点亮“可视化”和“联网” |
为什么这样安排?
- 不碰线程、QML、XML 解析等“炫技型”内容:它们在真实小工具中使用频率极低,新手强行学只会陷入“学了也不会用”的焦虑;
- 所有任务都基于 PDF 前 67 章:这份教程的精华就在前三分之二,后面章节(如第 71 章线程、第 76 章 QML)是给已有项目要升级的开发者准备的;
- 每个任务都可独立运行、有明确交付物:做完计算器,你就有个能算数的 EXE;做完待办清单,你就有个能存任务的工具;避免“学了一堆概念,却交不出东西”的挫败感。
从那以后我每次带新人,都强制他们用这三周路径走一遍:第一周必须交出计算器,第二周必须让待办清单能存能读,第三周必须让温度计随 API 数据动起来。不是为了考试,而是为了让“Qt 能做什么”这件事,从 PDF 里的铅字,变成你电脑里那个双击就能运行、朋友看了说“哇这个真有用”的真实文件。希望帮到你。
本文还有配套的精品资源,点击获取