简介:这份《QT学习之路2-2020整理版》面向希望系统掌握Qt框架的开发者,尤其适合从入门过渡到进阶的C++程序员。内容基于豆子博客整理,在原有79章基础上补充了2016年后更新的15章,共94章,覆盖Qt简介、信号槽机制、自定义信号槽、MainWindow、布局管理器、事件处理、对话框数据传递等核心主题,并延伸至多线程、国际化、数据库集成与网络编程等高级方向,同时涉及Qt Creator使用与调试技巧。资源为单个PDF文件,压缩包约5.79MB,目录结构清晰,便于按章节顺序学习或按主题检索。目前已有870人学习。读者可借助这份教程理解Qt5与Qt Creator的工程实践,掌握信号槽、事件模型、界面布局等关键机制,并了解实际项目中的常见用法与最佳实践,适合作为长期查阅的参考手册。
1. 从零开始学 Qt:为什么一个 C++ 框架值得你花时间
很多人第一次听到 Qt,脑子里冒出来的第一个问题不是“它是什么”,而是“我到底该不该学”。尤其是刚接触编程不久的朋友,看到 C++、框架、跨平台这些词,心里先凉了半截。其实换个角度想:你想做一个能在 Windows 上跑、也能在 Mac 上跑、甚至能塞进一块小屏幕设备里的程序,如果每种系统都从头写一遍,光是适配就能把人逼疯。Qt 就是来解决这个问题的——写一套代码,编译到不同平台,界面和功能都能正常跑起来。
这份《QT学习之路2-2020整理版》一共 94 章,从最基础的“Hello, world!”一路讲到多线程、数据库、网络、QML,是一份按顺序啃下来就能建立完整认知的教程。它适合谁?适合已经学过一点 C++、想找个方向动手做界面程序的新手;也适合以前用过其他 GUI 库、想换到 Qt 但不知道从哪一页翻起的人。你不需要先把 C++ 学到精通再来,边学 Qt 边补 C++ 是完全可行的路径。
2. 先搞懂 Qt 到底是什么:别被“框架”两个字吓住
2.1 用大白话讲:Qt 不是一门语言,是一整套工具箱
你可以把 C++ 想象成一种“通用材料”,而 Qt 是一整套已经做好的“零件箱”。里面有小到按钮、输入框,大到网络通信、数据库读写、多线程调度的各种零件。你写程序的过程,就是从箱子里挑零件、拼起来、再补上自己的逻辑。它最核心的几个特点,用新手能听懂的话来说就是:
- 跨平台:同一份代码,在 Windows 上编译一次,在 Linux 上再编译一次,界面和功能基本一致。不用为每个系统重写一遍。
- 信号槽:这是 Qt 最出名的机制。你可以理解为“当 A 发生什么事,自动通知 B 去做另一件事”。比如用户点了按钮,窗口就关掉——按钮发出“被点了”的信号,窗口的“关闭”槽函数接住这个信号并执行。
- 自带全套工具:字符串处理、文件读写、XML/JSON 解析、数据库连接、网络请求,Qt 都内置了对应的类。你不用再满世界找第三方库,也不用纠结版本兼容。
Qt 的界面并不是调用系统原生控件画出来的,而是自己模拟绘制的。好处是外观可以高度定制,坏处是某些细节和系统原生风格有细微差别。但对新手来说,这个差别在入门阶段基本可以忽略。
2.2 为什么 2020 整理版值得看:94 章不是凑数
网上流传的 Qt 教程很多,但大部分要么只讲到 70 多章就断了,要么是零散的文章合集,前后不连贯。这份整理版把原来 79 章之后的内容补到了 94 章,覆盖了 QML、Qt Quick、线程和 QObject 的关系、进程间通信这些进阶但必须了解的主题。它的结构是按学习路径排的:先环境搭建,再信号槽,再窗口部件,再文件、模型视图、数据库、网络,最后到 QML。你不需要跳着看,顺着章节号往下走就行。
提示:如果你完全没接触过 C++ 的类、继承、函数这些概念,建议先花两三天补一下最基础的语法。不用学到模板、智能指针那种程度,能看懂 class 定义和函数调用就够了。
3. 新手第一步怎么迈:环境搭好,第一个窗口跑起来
3.1 安装 Qt Creator:别在版本选择上纠结太久
Qt 的安装包现在整合得比较好,你只需要下载 Qt 官方提供的在线安装器,勾选一个 Qt 版本和对应的编译器就行。对于新手,我建议直接选 Qt 5 的某个稳定版本,配套的编译器在 Windows 上选 MinGW,在 Linux 上选系统自带的 GCC。安装过程中会问你要不要装源代码,新手可以先不装,省空间也省时间。
安装完成后打开 Qt Creator,你会看到一个很清爽的界面。左边是项目文件树,中间是代码编辑区,下面是编译输出窗口。第一次打开可能会让你选 kits,其实就是“用哪个 Qt 版本 + 哪个编译器”的组合,默认的就行。
3.2 第一个例子:三行代码弹出一个窗口
新建项目时选 “Qt Widgets Application”,给项目起个名字,比如HelloQt。Qt Creator 会自动生成几个文件,其中main.cpp是程序入口。把里面的内容改成下面这样:
#include <QApplication> #include <QLabel> int main(int argc, char *argv[]) { QApplication app(argc, argv); // 管理整个应用程序的资源 QLabel label("你好,Qt"); // 创建一个标签控件,显示文字 label.show(); // 把控件显示出来 return app.exec(); // 进入事件循环,等待用户操作 }逐行解释一下:QApplication是每个 Qt 程序都必须有的对象,它负责处理事件循环、系统资源这些事情。QLabel是一个最简单的界面控件,用来显示一行文字。label.show()让它可见。最后的app.exec()会让程序停在这里,不断接收鼠标点击、键盘输入等事件,直到你关闭窗口。
点左下角的绿色三角编译运行,你应该能看到一个很小的窗口,上面写着“你好,Qt”。恭喜,你已经跑通了第一个 Qt 程序。这个窗口虽然简陋,但它背后已经包含了 Qt 最核心的几件事:应用程序对象、控件、事件循环。
3.3 从“能跑”到“看懂”:信号槽的第一印象
第一个例子没有用到信号槽,但你可以马上试一个。把main.cpp改成这样:
#include <QApplication> #include <QPushButton> int main(int argc, char *argv[]) { QApplication app(argc, argv); QPushButton button("点我关闭"); // 创建一个按钮 QObject::connect(&button, &QPushButton::clicked, // 信号:按钮被点击 &app, &QApplication::quit); // 槽:应用程序退出 button.show(); return app.exec(); }这里connect函数把按钮的clicked信号和应用程序的quit槽连接起来。你点按钮,程序就退出。信号槽的语法在 Qt 5 里推荐用这种“函数指针”写法,编译器能帮你检查参数类型是否匹配,比旧版写法更安全。第一次看到&QPushButton::clicked可能觉得怪,把它当成“按钮被点击这件事的名字”就行。
注意:如果你用的是 Qt 4 的旧语法
SIGNAL(clicked())和SLOT(quit()),也能跑,但新手直接学 Qt 5 的新语法就好,更清晰也更不容易写错。
4. 避开新手最容易翻车的五个坑
4.1 坑一:编译报错 “undefined reference to vtable”
现象:写了一个继承自QObject的类,编译时提示虚函数表找不到。
原因:Qt 的信号槽需要 moc(元对象编译器)预处理。如果你的类声明了Q_OBJECT宏,但没有把该文件加入项目或没有重新运行 qmake,moc 就不会生成对应的代码。
解决:在 Qt Creator 里右键项目,选择“执行 qmake”,然后重新构建。如果还不行,检查类定义是否真的写了Q_OBJECT宏,并且类继承自QObject或其子类。
4.2 坑二:界面能显示,但按钮点了没反应
现象:按钮、菜单都画出来了,点击却没有任何动作。
原因:信号和槽没有连接成功,或者连接的时机不对。比如在对象还没构造完就去 connect,或者槽函数的参数和信号不匹配。
解决:先检查connect的返回值,它在失败时返回false。再检查信号和槽的参数列表是否一致(参数个数和类型都要对得上)。如果用的是自定义信号槽,确认信号和槽都声明在signals:和slots:区域下。
4.3 坑三:程序一运行就崩溃,提示 “QWidget: Cannot create a QWidget without QApplication”
现象:在main函数里创建控件之前没有先创建QApplication对象。
原因:所有 Qt 的界面控件都依赖QApplication来管理底层资源,没有它就直接崩溃。
解决:确保QApplication app(argc, argv);是main函数里第一个被创建的 Qt 对象,并且它一直存活到程序结束。
4.4 坑四:中文显示成乱码
现象:界面上本该显示中文的地方变成了一堆问号或方块。
原因:源代码文件的编码和 Qt 运行时的编码不一致。早期 Qt 4 默认用 Latin-1 处理字符串,Qt 5 默认用 UTF-8,但如果你在 Windows 上用某些编辑器保存成了 GBK,就会乱码。
解决:把源代码文件统一保存为 UTF-8 编码。在 Qt Creator 里可以在“工具 → 选项 → 文本编辑器 → 行为”中设置默认编码为 UTF-8。如果仍然乱码,可以在main函数开头加一行QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));,但更推荐从源头统一编码。
4.5 坑五:跟着教程写代码,但教程用的是 Qt 4,我装的是 Qt 5
现象:教程里的某些头文件路径、类名、函数签名在 Qt 5 里变了,编译不过。
原因:Qt 5 相比 Qt 4 做了一些模块拆分和 API 调整,比如QApplication的头文件位置变了,某些旧类被标记为废弃。
解决:这份 94 章教程本身已经兼顾了 Qt 4 和 Qt 5,遇到不一致的地方优先看章节里关于 Qt 5 的说明。如果教程没提,就去查 Qt 5 的官方文档,看对应的类在 Qt 5 里推荐用哪个替代。新手不要死磕旧写法,直接学新写法。
5. 接下来学什么:一条不绕弯的入门路线
5.1 前 30 章怎么读最省力
这份教程的章节顺序本身就是一条学习路径。我建议你按下面的节奏走:
| 阶段 | 章节范围 | 重点内容 | 建议用时 |
|---|---|---|---|
| 环境与第一个程序 | 第 1–3 章 | 安装 Qt Creator,跑通 Hello World | 1 天 |
| 信号槽与窗口基础 | 第 4–15 章 | 信号槽、自定义信号槽、MainWindow、对话框 | 5–7 天 |
| 事件与绘图 | 第 16–30 章 | 事件处理、画笔、坐标系统、Graphics View | 7–10 天 |
| 文件、模型视图、数据库 | 第 35–58 章 | 文件读写、QListWidget、QSqlTableModel | 10–14 天 |
| 网络、线程、QML | 第 65–94 章 | 网络访问、多线程、QML 基础 | 14–20 天 |
不要试图一天啃完十章。每学完一个概念,就自己动手改一改代码。比如学完信号槽,就试着做一个按钮点击后改变标签文字的小程序。学完布局管理器,就把之前的窗口用水平布局和垂直布局重新排一遍。动手改代码比单纯看书有效得多。
5.2 一个具体技巧:用 Qt 自带的例子学
Qt Creator 的欢迎界面里有一个“示例”按钮,里面按模块分类了几百个官方示例。这些示例的代码质量很高,而且可以直接编译运行。当你学到某一章觉得抽象时,去示例里搜关键词,比如学到“模型视图”就搜model view,找到对应的例子跑一遍,再回头看书里的解释,理解会快很多。
我自己的习惯是:每学完一个模块,就从示例里找一个最小的项目,把它的代码从头到尾读一遍,然后尝试删掉一些行,看程序会出什么错。这种“破坏性阅读”能让你很快搞清楚哪些代码是核心、哪些只是辅助。
5.3 最后的建议:别在第一章就想着做完整项目
新手最容易犯的错,是刚学完信号槽就想做一个记事本或者聊天工具。结果卡在文件读写、界面布局、事件处理各种细节上,信心被磨光。正确的做法是:把教程里的每个小例子都跑一遍,改一遍,确保自己真的理解了再往下走。等你把前 30 章过完,再回头做一个小项目,你会发现之前觉得难的东西已经变得很自然。
从那以后我每次带新人,都强制他们先跑通第一个窗口,再改三行代码,再自己写一个按钮关闭程序。这三步走完,后面就顺了。希望帮到你。
本文还有配套的精品资源,点击获取