ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

Qt学习之路:从零开始掌握C++跨平台开发

Qt学习之路:从零开始掌握C++跨平台开发

简介:这份《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 World1 天
信号槽与窗口基础第 4–15 章信号槽、自定义信号槽、MainWindow、对话框5–7 天
事件与绘图第 16–30 章事件处理、画笔、坐标系统、Graphics View7–10 天
文件、模型视图、数据库第 35–58 章文件读写、QListWidget、QSqlTableModel10–14 天
网络、线程、QML第 65–94 章网络访问、多线程、QML 基础14–20 天

不要试图一天啃完十章。每学完一个概念,就自己动手改一改代码。比如学完信号槽,就试着做一个按钮点击后改变标签文字的小程序。学完布局管理器,就把之前的窗口用水平布局和垂直布局重新排一遍。动手改代码比单纯看书有效得多。

5.2 一个具体技巧:用 Qt 自带的例子学

Qt Creator 的欢迎界面里有一个“示例”按钮,里面按模块分类了几百个官方示例。这些示例的代码质量很高,而且可以直接编译运行。当你学到某一章觉得抽象时,去示例里搜关键词,比如学到“模型视图”就搜model view,找到对应的例子跑一遍,再回头看书里的解释,理解会快很多。

我自己的习惯是:每学完一个模块,就从示例里找一个最小的项目,把它的代码从头到尾读一遍,然后尝试删掉一些行,看程序会出什么错。这种“破坏性阅读”能让你很快搞清楚哪些代码是核心、哪些只是辅助。

5.3 最后的建议:别在第一章就想着做完整项目

新手最容易犯的错,是刚学完信号槽就想做一个记事本或者聊天工具。结果卡在文件读写、界面布局、事件处理各种细节上,信心被磨光。正确的做法是:把教程里的每个小例子都跑一遍,改一遍,确保自己真的理解了再往下走。等你把前 30 章过完,再回头做一个小项目,你会发现之前觉得难的东西已经变得很自然。

从那以后我每次带新人,都强制他们先跑通第一个窗口,再改三行代码,再自己写一个按钮关闭程序。这三步走完,后面就顺了。希望帮到你。

本文还有配套的精品资源,点击获取

返回列表