简介:《Qt5范例开发大全(完整目录版)》是一份面向C++开发者与Qt初学者的实例型PDF教程,围绕Qt5框架从开发环境搭建、窗体与控件设计延伸到文件、图形图像、多媒体、系统、注册表、数据库、网络、进程线程及数据安全等进阶主题,帮助读者在动手实践中建立完整知识脉络。压缩包内共1个PDF文件,大小约2.84MB,完整目录便于按章节检索,既可顺序学习,也可作为开发时的速查手册。目前已有2459人学习,说明其在Qt5入门与实战参考方面具有一定认可度。书中以大量范例串联QPushButton、QLabel、QLineEdit、QComboBox、QTableView等常用控件,并覆盖布局管理、多窗体调用、文件操作、网络与线程等典型场景;末章还涉及应用程序打包与多平台部署思路,适合需要从界面开发走向综合项目实践的读者查漏补缺、积累实现方案。
1. 装 Qt5 之前先把版本对齐:5.1.1 配 MinGW 4.8,这一对拆开就出事
Qt5 C++ 开发环境的搭建,十次出问题里有八次不是手抖点错,是版本没对齐。Qt 5.1.1 那个年代的 Windows 离线包是把 Qt 库、MinGW 4.8 32 位工具链和 Qt Creator 三样捆死在一起的,安装包名字里的 mingw48_opengl_x86 就是明确约定:换成 MSVC 编译不过,换成 64 位 MinGW 链接报错,拿新版 Qt 去开按 5.1.1 写的工程则一堆 API 直接标红。这套环境最适合手里有一份按 5.1.1 编排的 C++ 范例目录、想一个一个跑通的人,桌面小工具、上位机界面、课程设计都够用。装不好也不是完全不能用,只是每回编译都得重新猜一次到底哪儿不对。下面按我实际装机的顺序走一遍,从下包到跑通范例代码,中间哪些参数能动、哪些不能动,一并说清。
2. 下载安装 Qt5.1.1:离线包、组件与目录结构
2.1 离线包和在线安装器怎么挑
当年官方给了两条路:一个是几百兆的 offline 整包,一个是几十兆的在线安装器。我一般选离线包,理由很实在——在线安装器在装到一半要回头拉组件,网络稍微抖一下就得从头来,而且它拉的是当时最新的子版本,未必还是 5.1.1。项目正文里写得很明确,针对 Windows 环境用的是 Qt5.1.1 for Windows 32-bit (MinGW 4.8, OpenGL, 666 MB),对应的可执行文件是qt-windows-opensource-5.1.1-mingw48_opengl-x86-offline.exe。这个名字拆开就是三件事:Qt 版本 5.1.1、编译器 MinGW 4.8、图形后端 OpenGL、目标架构 x86。x86 指的是 32 位,不是说你机器必须是 32 位系统,64 位 Windows 上照样能装能跑,只是链接的是 32 位库。
下包的时候认准官方归档目录里的 5.1 分支,别在首页点最新版。首页永远推新的,而范例代码是按 5.1.1 的 API 写的,版本漂移带来的编译错误够你喝一壶。文件大小对得上 666 MB 基本就没下错,下完可以先看一眼数字签名再双击。
2.2 安装向导里真正需要动手的三处
双击之后一路下一步没错,但有三处值得停一下。
第一处是安装目录。默认往 C 盘 Program Files 里塞,路径里带空格。Qt 的 moc、uic 这些工具对空格和中文路径的容忍度不高,后面手动敲命令行编译时加引号也麻烦。我一般直接改成D:\Qt\Qt5.1.1,纯英文、无空格、层级浅。这条是实实在在踩过的经验,路径带空格时 moc 生成的文件名偶尔会被截断,报错信息还特别绕。
第二处是组件勾选。离线包里的组件树大致是 Qt 5.1.1 下的 MinGW 4.8 32bit、Qt Creator、以及可选的 Sources 和 Examples。MinGW 那一项必须勾,它同时带库文件和工具链;Qt Creator 也勾上,这是主 IDE;Sources 体积不小,但排错时能点进 Qt 源码看实现,磁盘不紧张就留着。剩下的平台套件(比如 VS 相关的)不用勾,勾了也用不上,白占空间。
第三处是许可协议,接受即可。之后就是等进度条,几分钟的事。装完向导会给一个完成页,别急着点 Finish 直接开 IDE,先去看目录。
2.3 装完先认目录:bin、lib、Tools 三层各放什么
装完之后D:\Qt\Qt5.1.1下面会长成这么个结构,认清楚它后面配环境变量就不会瞎猜:
D:\Qt\Qt5.1.1\ ├── 5.1.1\mingw48_32\ # Qt 库本体 │ ├── bin\ # qmake.exe、windeployqt.exe、Qt5Core.dll 等 │ ├── lib\ # 导入库 libQt5Core.a 之类 │ ├── include\ # 头文件 │ └── plugins\ # platforms、imageformats、sqldrivers ├── Tools\ │ ├── mingw48_32\bin\ # g++.exe、mingw32-make.exe │ └── QtCreator\bin\ # qtcreator.exe └── MaintenanceTool.exe # 后续增删组件用这里有个容易搞混的点:5.1.1\mingw48_32\bin和Tools\mingw48_32\bin是两个不同的 bin。前者放的是 Qt 自己的工具和运行时 DLL,后者放的是编译器。两个都得进 PATH,少一个就会出现「qmake 找到了但 g++ 找不到」或者反过来的怪现象。另外plugins\platforms目录先记住,后面程序双击闪退十有八九跟它有关。
提示:安装目录一旦定下来就别再挪。Qt 的 qmake 会把安装路径硬编码进
Qt5CoreConfig.cmake和 qmake 的 mkspecs 里,整体剪切到别的盘符后,编译能过但链接会找不到库。
3. 环境变量与构建套件:让 qmake 和 g++ 都能被叫到
3.1 PATH 里要加的是两条,不是一条
项目正文里给的做法是在系统变量 Path 末尾追加;D:\Qt\Qt5.1.1\5.1.1\mingw48_32\bin,注意前面那个分号。这一步的作用是让系统在任何目录下都能直接叫到 qmake 和 windeployqt,发布 exe 的时候不用每次敲全路径。但只加这一条不够,编译器还叫不到,所以我把工具链那条也一起加上。
图形界面路径是:桌面「我的电脑」右键 → 属性 → 高级系统设置 → 环境变量 → 在「系统变量」里找到 Path → 编辑 → 在变量值末尾追加。两条路径之间用英文分号隔开,不要用中文分号,也不要在末尾多留一个分号。写成这样:
# 系统变量 Path 的末尾追加内容,两条之间用英文分号 ;D:\Qt\Qt5.1.1\5.1.1\mingw48_32\bin;D:\Qt\Qt5.1.1\Tools\mingw48_32\bin如果只是想临时试一下,不想动系统设置,可以在 cmd 里用 set 追加,关掉窗口就失效:
REM 仅对当前 cmd 窗口生效,用来验证路径对不对 set PATH=%PATH%;D:\Qt\Qt5.1.1\5.1.1\mingw48_32\bin set PATH=%PATH%;D:\Qt\Qt5.1.1\Tools\mingw48_32\bin where qmake where g++where会按 PATH 顺序列出所有同名可执行文件的位置。如果输出的不是你刚加的那个路径,说明前面有别的 Qt 版本在抢,这种情况在多版本共存的机器上特别常见。改完环境变量必须重开一个新的 cmd 窗口,老窗口里的 PATH 是启动那一刻的快照,不会自动刷新,这一点每年都有人栽。
3.2 Qt Creator 的 Kit:qmake、编译器、调试器三件套
环境变量管的是命令行,Qt Creator 内部还有一套自己的配置,叫构建套件(Kit)。装完第一次打开 Qt Creator,进「工具 → 选项 → 构建和运行」,三个标签页要挨个看。
「Qt 版本」页里应该已经自动识别出一条,路径指向D:\Qt\Qt5.1.1\5.1.1\mingw48_32\bin\qmake.exe。如果没有,点「添加」,手动选到那个 qmake。这里选错版本是最常见的错误来源——机器上装了多个 Qt 时,自动识别经常挑到不是你想要的那个。
「编译器」页里要有 MinGW 的 C++ 编译器,路径是D:\Qt\Qt5.1.1\Tools\mingw48_32\bin\g++.exe。调试器一栏在 5.1.1 这套包里指向 gdb.exe,同目录下。如果这一页是空的,说明安装时 MinGW 组件没勾上,得回去用 MaintenanceTool 补装。
「构建套件」页是把上面两样绑在一起的地方。一个正常的 Kit 长这样:设备类型选 Desktop,编译器选刚识别出的 MinGW,Qt 版本选 5.1.1,下面一行不会有黄色感叹号。有感叹号就点开看提示,通常是某一项为空。Kit 配置错了的表现很统一:新建工程能建,一编译就报一堆找不到头文件的错。
3.3 命令行复核:不看 IDE 脸色
IDE 配好了不代表环境真的通了,我习惯在命令行再验一遍,因为 IDE 会用它自己的内部配置,容易掩盖 PATH 的问题。
qmake -v # 期望输出: # QMake version 3.0 # Using Qt version 5.1.1 in D:/Qt/Qt5.1.1/5.1.1/mingw48_32/lib mingw32-make -v # 期望输出 GNU Make 版本号和版权信息 g++ --version # 期望输出 g++ (GCC) 4.8.x三行命令对应三件事:qmake 能不能找到、Qt 版本对不对、make 和编译器在不在。qmake -v 输出里那行Using Qt version 5.1.1是关键,如果显示别的版本号,说明 PATH 里前面还有别的 Qt 在挡路。这一步过了,说明环境层面的东西齐了,可以进工程。
注意:Qt 5.1.1 的构建工具叫
mingw32-make,不叫make。在 cmd 里敲 make 会提示不是内部或外部命令,不是环境坏了,是名字本来就不一样。嫌长可以自己做个 doskey 别名,但别去改文件名。
4. 跑通第一个示例工程:从 Hello World 到 .pro 文件
4.1 新建工程时那三个基类怎么选
Qt Creator 里「文件 → 新建文件或项目 → 应用程序 → Qt Gui 应用」,一路下一步,会停在选基类的界面。这里给三个选项:QMainWindow、QWidget、QDialog。范例目录第二章开头专门讲了这三个的区别,我按实际用法说。
QMainWindow 是主窗口,自带菜单栏、工具栏、状态栏和中央部件区,适合做那种有完整菜单的应用,比如带「文件 / 编辑 / 帮助」的编辑器。QWidget 是所有界面对象的基类,最轻,没有多余装饰,做个计算器、做个串口上位机就用它。QDialog 是对话框,用于短期交互,比如登录框、文件浏览框,它可以是模态的(挡住父窗口不让点)也可以是非模态的,还能带返回值。
选错基类不会编译失败,但后面想加菜单栏就得改类继承关系,麻烦。我的判断标准很简单:这窗口要不要菜单栏,要就 QMainWindow;是不是弹出来问一句就关,是就 QDialog;剩下的都 QWidget。项目名和路径那一步注意路径别带中文,原因和第 2 章说的一样。
4.2 从 main.cpp 到 mainwindow.cpp 的最小骨架
建完工程,Qt Creator 会自动生成几个文件。main.cpp 是入口,长这样:
#include "mainwindow.h" #include <QApplication> int main(int argc, char *argv[]) { QApplication a(argc, argv); // 每个 GUI 程序有且只有一个,管理事件循环和资源 MainWindow w; // 栈上创建,函数返回时自动析构 w.show(); // 把窗体显示出来 return a.exec(); // 进入事件循环,程序停在这里直到窗口关闭 }参数argc是命令行参数个数,argv[]是参数字符串数组,原样传给 QApplication 就行,不用自己解析。a.exec()是个阻塞调用,后面所有鼠标点击、键盘输入、定时器都在这个循环里被分发,它的返回值会作为进程退出码交给系统。很多新手以为w.show()之后程序就在跑了,其实真正的运行是 exec 那一行。
再往 mainwindow.cpp 里加一段显示文字的代码,这就是书里第一个 Hello World 的骨架:
#include "mainwindow.h" #include "ui_mainwindow.h" #include <QLabel> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); this->setWindowTitle("Qt5.1 窗体应用"); QLabel *label = new QLabel(this); // 传入 this 作父对象,由父对象统一回收 label->setText("Hello World"); label->setGeometry(QRect(60, 60, 200, 40)); // 前两个是相对窗体的 x、y,后两个是宽和高 } MainWindow::~MainWindow() { delete ui; // ui 是 new 出来的,得手动删 }setGeometry那四个参数是书里特意解释过的,顺序是 x、y、宽、高,坐标原点是窗体的左上角,单位是像素。这套坐标是绝对定位,窗口一拉大控件不会跟着动,所以后面章节才会讲 QHBoxLayout 和 QGridLayout 这些布局管理器。先用绝对定位把东西显示出来,是为了让第一个程序足够短,能跑起来看到字,心态就稳了。
4.3 .pro 文件读一遍,debug 和 release 目录怎么来的
每个 Qt 工程根目录下都有一个.pro文件,qmake 读它生成 Makefile。自动生成的版本大致是:
QT += core gui # 依赖的 Qt 模块 greaterThan(QT_MAJOR_VERSION, 4): QT += widgets # Qt5 里 widgets 被拆成独立模块 TARGET = QtOne # 生成的可执行文件名 TEMPLATE = app # 工程类型,app 表示应用程序 SOURCES += main.cpp\ mainwindow.cpp HEADERS += mainwindow.h FORMS += mainwindow.uigreaterThan(QT_MAJOR_VERSION, 4): QT += widgets这行是 Qt4 和 Qt5 的兼容写法。Qt5 把控件从 gui 模块里拆到了 widgets 模块,所以主版本大于 4 时才加这一句。用 5.1.1 建工程它会自动加上,你手写 .pro 时漏了这句,编译就会报找不到 QMainWindow。
点左下角那个绿色三角,Qt Creator 会先跑 qmake 生成 Makefile,再调 mingw32-make 编译。编译产物分两个目录:debug 和 release,取决于你在哪套构建配置下点的编译,这是 IDE 根据构建设置自动生成的,不是工程自带。debug 版本带调试符号、体积大、能打断点;release 版本做了优化、体积小,发布用。范例代码对应的工程结构和这个完全一致,所以你照着目录里的 .pro 打开,编译路径不会对不上。
命令行编译的等价操作是这样,排错时比 IDE 更好用,因为每步输出都看得见:
cd /d D:\QtProjects\QtOne qmake QtOne.pro # 生成 Makefile mingw32-make -j4 # -j4 表示四线程并行编译,核多的机器可以加大-j4是并行编译的线程数,一般设成 CPU 核心数,能明显缩短大工程的编译时间。小工程看不出差别,但范例里有几个带多文件的工程,加上会舒服些。
5. 安装与编译的常见问题:五条踩坑记录
5.1 命令行提示 qmake 不是内部或外部命令
现象:cmd 里敲 qmake 直接报「不是内部或外部命令,也不是可运行的程序」,但 Qt Creator 里能正常编译。
原因:PATH 没生效,或者加进去了但没重开终端。还有一种情况是加到了「用户变量」的 Path 里,而当前是以另一个账户提权运行的 cmd,读的是系统变量那一份。
解决:先关掉所有 cmd 窗口重开一个,再where qmake。还是找不到就回到环境变量界面确认路径确实在系统变量 Path 里,并且路径本身没写错——mingw48_32这个目录名里是下划线,不是连字符,手敲很容易打错。改完重启终端再验。
5.2 编译报 cannot find -lQt5Widgets
现象:qmake 过了,make 到链接阶段报一堆cannot find -lQt5Widgets、cannot find -lQt5Core。
原因:qmake 找到的 Qt 版本和实际的库文件不匹配。典型场景是机器上装了两个 Qt,PATH 里排前面的是另一个版本的 qmake,它去自己的 lib 目录找库,那边没有 5.1.1 的 .a 文件。另一种可能是安装时 MinGW 组件没勾全,lib 目录是空的。
解决:qmake -v看输出里的路径是不是D:/Qt/Qt5.1.1/5.1.1/mingw48_32/lib。不是的话把 PATH 里这条往前挪,或者把挡路的那个 Qt 路径临时删掉。确认路径对了还报错,就去 lib 目录下数一眼libQt5Widgets.a在不在,不在就重跑安装包补组件。
5.3 编译出来的 exe 双击一闪就没
现象:在 IDE 里点运行正常,跑到 debug 或 release 目录里双击 exe,黑框一闪,程序没了。
原因:缺 Qt 的运行时 DLL。IDE 启动程序时会临时把 Qt 的 bin 目录加进进程的搜索路径,所以能跑;双击 exe 走的是系统默认搜索顺序,找不到 Qt5Cored.dll 就直接退出。
解决:临时办法是把D:\Qt\Qt5.1.1\5.1.1\mingw48_32\bin加进 PATH。正式发布的做法是用 windeployqt 把依赖拷到 exe 旁边:
cd /d D:\QtProjects\QtOne\release windeployqt QtOne.exe # 工具会把 Qt5Core.dll、Qt5Gui.dll、platforms\qwindows.dll 等拷到当前目录5.1.1 这一版的 windeployqt 对插件的识别不算完整,跑完最好自己检查一眼platforms目录在不在。它不在的话,程序仍然起不来,见下一条。
5.4 报 no Qt platform plugin could be initialized
现象:exe 拷到别的机器上,双击弹窗提示This application failed to start because no Qt platform plugin could be initialized,重装运行库也没用。
原因:Qt5 的界面渲染是靠插件实现的,Windows 下对应plugins\platforms\qwindows.dll。这个 dll 不在 exe 同级的platforms目录里,Qt 就不知道该怎么画窗口。
解决:手动建目录再拷文件,目录名必须是platforms,一个字母都不能改:
mkdir D:\QtProjects\QtOne\release\platforms copy D:\Qt\Qt5.1.1\5.1.1\mingw48_32\plugins\platforms\qwindows.dll D:\QtProjects\QtOne\release\platforms\拷完再双击。如果还有问题,在 exe 同目录开个 cmd,设set QT_DEBUG_PLUGINS=1再运行,它会打印插件加载的详细过程,哪一步失败看得一清二楚,这个环境变量算是排这类问题的黑匣子。
5.5 路径里有中文导致 moc 失败
现象:工程放在桌面或「新建文件夹」里,编译到 moc 那一步报错,提示找不到文件或编码异常,错误信息里能看到一串乱码路径。
原因:moc 是 Qt 的元对象编译器,它生成的中间文件路径直接拼自工程路径,中文路径在部分版本的工具链下编码处理不干净,拼出来的路径就对不上了。
解决:把整个工程目录挪到纯英文无空格的路径下,比如D:\QtProjects\,然后在 Qt Creator 里重新打开 .pro 文件。这一步没有后悔药,工程已经生成的 build 目录建议一起删掉重建,残留的 Makefile 里还带着旧路径。
6. 装完怎么验证跑通:三步交叉验证
环境装完,别急着开始写自己的代码,先花二十分钟把「能跑」这件事验证扎实。我一般分三步走,每一步用的工具不一样,交叉起来才能把问题定位到具体层面。
第一步只信命令行,不看 IDE。随便找个空目录,手写一个最小工程,用 qmake 加 mingw32-make 编出来:
cd /d D:\QtProjects\verify qmake -project "QT += widgets" # 生成 .pro,省得手写 qmake verify.pro mingw32-make -j4这三行能跑通,说明 qmake、编译器、Qt 库三者是对齐的,问题不会出在环境层面。如果这一步就挂了,别去 IDE 里折腾,回来查 PATH 和 Kit。
第二步回 IDE 建工程验证。新建一个 Qt Gui 应用,基类选 QWidget,什么都不改直接编译运行,能弹出空白窗口就算过。再打开范例目录里第 1 章那个 Hello World 工程,对照着把 QLabel 那几行敲进去,看文字能不能显示。这一步验的是 Kit 配置和资源引用。
第三步换一台没装过 Qt 的机器,拷 release 目录过去双击。这一步最容易翻车,也最能说明问题——本机能跑不代表发出去能跑。拷的时候连着 platforms 目录一起拷,缺 DLL 的表现和缺插件不一样,报错信息也不一样,正好区分。
按范例目录逐块点验的话,我习惯按这个顺序走,从轻到重,前面挂了不用往后试:
| 验证块 | 对应章节 | 验证动作 | 通过标准 |
|---|---|---|---|
| 环境 | 第 1 章 | 命令行 qmake + make | 生成 exe |
| 窗体 | 第 2 章 | 改标题、设固定大小 | 窗口属性生效 |
| 控件 | 第 3 章 | 拖几个按钮和输入框 | 交互正常 |
| 文件 | 第 5 章 | 写一个 INI 再读回来 | 内容一致 |
| 数据库 | 第 10 章 | 打印 QSqlDatabase::drivers() | 列表里有 QSQLITE |
| 打包 | 第 14 章 | 打包后换机运行 | 不报缺 DLL |
数据库那一行值得单独说一句。Qt5.1.1 的 SQLite 驱动是插件形式,装完默认就在plugins\sqldrivers\qsqlite.dll,但发布时必须手动拷过去,否则程序在本机好好的,到别人机器上一连库就返回空驱动列表。查驱动的代码就一行qDebug() << QSqlDatabase::drivers();,输出里没有 QSQLITE 就是插件没找到。
打包环节,书里给了 FilePacker 和 Inno Setup 两种思路,前者偏轻量、适合内部流通,后者能做出标准安装向导、能写注册表和开始菜单项。不管用哪个,打包前都先用 windeployqt 把依赖理一遍,把 release 目录清干净再打,别把 debug 版的 DLL 混进去——混进去的表现是程序能启动但偶尔崩,查起来非常费劲。
从那以后我每次装完 Qt,都强制走一遍「命令行编一次、IDE 编一次、干净机器跑一次」这三步,不管多赶时间都不跳过。前面省下的十分钟,后面往往要拿两小时来找。希望这套流程能帮你少走几段弯路。
本文还有配套的精品资源,点击获取