Qt 5.1.1+MinGW 4.8安装配置与Hello World部署排错指南
简介《C Qt5 范例开发大全》中文版面向Qt5初学者与转向C桌面开发的程序员通过举例的方式讲解从环境搭建到界面与功能实现的主要环节。压缩包仅含1个PDF文件约2.83MB轻便易存适合对照练习与随时查阅。内容按开发环境、窗体应用、控件应用、组件应用、文件操作等模块递进从Qt Creator安装与Hello World起步讲到窗体大小与位置控制、背景色设置与无边框移动、多窗体调用再到QPushButton、QLineEdit、QComboBox、QTreeView、QTableView等常用控件及横向、网格布局的搭配并延伸至日历、登录窗口、文件与颜色选择对话框、进度条、定时器刷新时间等实例另涉及QPainter绘图与加解密接口的应用思路。对需要快速上手Qt5、查找控件用法或补充项目实例的开发者较为实用目前已有256人学习。1. 从一台只装过编译器的机器说起Qt 5.1.1 MinGW 4.8 为什么照着书装也会卡住翻开《C Qt5 范例开发大全》1.2 节讲的就是下载安装 Qt Creator配套离线包是 qt-windows-opensource-5.1.1-mingw48_opengl-x86-offline.exe装完把D:\Qt\Qt5.1.1\5.1.1\mingw48_32\bin塞进 PATH接着跑 Hello World。听上去是点四次下一步的事真正卡人的却不在向导本身选错带 msvc 字样的包、PATH 末尾少写一个分号、构建套件里 qmake 指到了半年前装的另一个 Qt任何一个都会让新建工程直接报没有编译器。Qt Creator 的报错只给一句话不说缺什么。装不好的后果很实在第 2 章窗体、第 3 章控件那些范例全跑不起来或者编译过了双击 exe 闪退连窗口都看不见。这套 Qt 5.1.1 MinGW 4.8 组合适合手里有范例源码、想按章节一个个跑通的人也适合机器上已经躺着两三个 Qt 版本、一编译就找错库的老机器。2. 装 Qt 5.1.1 之前先把环境对齐离线包、编译器与 PATH 三件事这一章不急着点安装器先把「装哪个包、装到哪、装完命令行能不能找到它」三件事定下来。范例书默认读者的机器是干净的 32 位 Windows 环境可现实里大多数人的机器上早就有别的 Qt、别的编译器、别的 IDE环境不先对齐后面每一章都会在构建这一步反复失败。2.1 离线安装包怎么选从文件名读出编译器范例配套的安装包名字很长但每一个片段都在告诉你它是什么货文件名片段含义选错了会怎样qt-windows-opensource开源版安装包版本号对不上时范例里部分类名会变5.1.1Qt 库版本5.x 之间 API 差异不大但部署方式差很多mingw48内置 MinGW 4.8 编译器装成 msvc 包就得另装对应版本的编译器opengl图形后端是 OpenGL 版换成 angle 版在部分老显卡驱动上表现不同x8632 位64 位包编译出来的 exe 放不进 32 位系统offline离线完整安装包约 666 MB在线安装器要求全程联网网差时反复断包里带 MinGW 是最省心的一点安装器会顺手把编译器、make、gdb 一起放进来不需要你另外去找编译器。我一般优先选这种「编译器自带」的包因为范例里的工程路径、编译参数都是按 MinGW 写的换编译器往往要在.pro里补一堆条件判断。后来 5.x 系列的包名里还会出现msvc2013_64、android_armv7这类后缀那是给别的目标平台准备的跑这本书的桌面范例用不上装了只会让构建套件列表变长。还有一点容易忽略这本书的范例代码是围绕 Qt 5.1 写的控件类名、信号槽写法都是 5.x 早期风格。你要是拿 5.15 或 6.x 去跑大部分代码没问题但部署、模块拆分、部分宏定义会发生变动。新手照书走先把 5.1.1 这套装起来等把第 3 章控件、第 10 章数据库跑通了再考虑升版本别一上来就混着装。提示下载完先核对文件大小离线包一般在六百多 MB。文件只有几十 MB 说明下载被截断装到一半会报解压失败。2.2 安装向导里值得停下来改的几处安装器前面几步都是下一步但有两处我每次都会停下来手动改第一处是安装路径。默认路径可能是C:\Qt\Qt5.1.1我习惯改成D:\Qt\Qt5.1.1。原因不是盘符是路径里绝对不能出现中文和空格。后面.pro文件、makefile、部署脚本里到处要拼这个路径路径里一旦有空格qmake 生成的构建命令就可能在空格处被截断报出一堆莫名其妙的「找不到文件」。同理工程目录也别放在「桌面」「我的文档」下中文路径在 MinGW 4.8 这套老工具链上是玄学问题能不碰就不碰。第二处是组件勾选。至少要勾上这两项Qt 5.1.1下面的MinGW 4.8 32 bit这是库本体加配套编译器Tools下面的MinGW 4.8这是编译器工具链本体。勾了Sources会多占一些空间好处是调试时按 F2 能直接跳进 Qt 的源码看实现对读范例很有用。没勾也不影响编译运行只是跳转过去看到的是头文件声明。安装向导最后会问要不要关联.pro、.ui这类文件类型机器上没别的 Qt 版本就勾上有的话先别勾免得双击.pro打开的是旧版本 IDE。安装过程几分钟结束时安装器会给一个「安装成功」的页面。这时候先别急着点开 Qt Creator 建工程把环境变量配完再开能省掉一次重启 IDE 的麻烦。2.3 环境变量 PATH 的正确写法与三条验证命令范例 1.2 节写的是右键「我的电脑」→ 属性 → 高级 → 环境变量 → 系统变量里找Path→ 双击 → 在末尾追加;D:\Qt\Qt5.1.1\5.1.1\mingw48_32\bin注意前面那个分号。这段在 Windows 7 上完全正确在 Windows 10/11 上要改一下操作方式新版是把 Path 拆成一行一行的列表点「新建」加一条即可这时候千万别再手写分号否则会多出一个空条目。这里有个书上没写、但实际必须补的路径。范例只让你加mingw48_32\binQt 库的 bin可编译器本身在另一个目录# 系统变量 Path 里最终应该有这两条按顺序别写分号在行首 D:\Qt\Qt5.1.1\5.1.1\mingw48_32\bin D:\Qt\Qt5.1.1\Tools\mingw48_32\bin第一条给的是 Qt 的 DLL 和 qmake第二条给的是 g、gcc、mingw32-make、gdb。只加第一条Qt Creator 里能编译但命令行里敲g会提示不是内部或外部命令只加第二条qmake 找不到。两条都加上才算环境齐了。改完必须新开一个命令行窗口再验证已经开着的窗口读的是旧环境。三条命令依次敲qmake -v # 期望看到 QMake version 3.0 与 Using Qt version 5.1.1 where qmake # 看解析到的第一个 qmake 是不是 D:\Qt\Qt5.1.1\...\bin\qmake.exe g --version # 期望看到 g (GCC) 4.8.xwhere这条特别关键。机器上装过多个 Qt 的时候PATH 里排在前面的那个版本会赢where qmake一敲就露馅。如果输出里第一条不是你想用的那个路径就去 PATH 里把目标路径上移到最前面别指望 Qt Creator 的界面设置能覆盖命令行行为。注意where输出多行是正常的说明系统里确实有多个 qmake。构建套件里要显式指定用哪一个这一点在第 3 章讲。3. 跑通第一个工程Qt Creator 建项、构建套件绑定与手动部署 DLL环境变量配完接下来是把范例第 1 章的 Hello World 真正跑起来并且让它脱离 IDE 也能双击运行。这一步很多人只做到「IDE 里能跑」就停了结果把 exe 发给别人或者换个目录一放就闪退回头又以为是代码问题。3.1 三个基类怎么选QMainWindow、QWidget、QDialog 的差别新建工程到选择基类那一步Qt Creator 会给三个选项。范例第 2 章 1.1 节专门讲过它们的区别我按实际用法重新梳理一遍基类带什么什么时候用QMainWindow菜单栏、工具栏、状态栏、中心部件需要完整主窗口的应用书里大部分窗体范例用它QWidget什么都没有纯空白窗口只想要一块画布或做自定义控件、弹窗QDialog默认按钮区支持模态登录框、设置框这类短期交互窗口选错基类不会报错但后面要加菜单栏就得自己new QMenuBar要多写不少代码。照书跑范例的话绝大部分选QMainWindow就对第 4 章的登录窗口那一节选QDialog更贴合场景。建完工程主窗口代码大致是这样和范例 1.3 节一致// mainwindow.cpp #include mainwindow.h #include ui_mainwindow.h #include QLabel // 范例第 1 章用 QLabel 往窗体上贴文字 MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui-setupUi(this); QLabel *label new QLabel(this); // 传入 this交给父对象回收 label-setText(Hello World); // 显示内容 label-setGeometry(QRect(50, 50, 160, 40)); // x50, y50, 宽160, 高40 }setGeometry四个参数依次是控件左上角相对父窗口的 X、Y 坐标和控件自身的宽、高。这里的重点是new QLabel(this)里那个this传了父对象窗口析构时会自动释放这个 label不用手写delete范例里说的「回收机制」指的就是这个父子对象树。main.cpp那边不用改QApplication a(argc, argv)建应用对象MainWindow w建窗口w.show()显示return a.exec()进事件循环。事件循环不退出窗口就一直响应鼠标键盘exec()返回的那一刻程序才真正结束。3.2 构建套件Kit里 qmake、g、gdb 三个路径工程建好点绿色箭头如果弹「Qt Creator needs a compiler set up to build」问题一定在构建套件。路径是菜单栏「工具」→「选项」→「构建和运行」里面有三个页签要挨个看。先看「编译器」页签C分类下应该有MinGW 4.8 32bit编译器路径指向D:\Qt\Qt5.1.1\Tools\mingw48_32\bin\g.exe没有就点「添加」→「MinGW」→ 手动选到g.exe名字随便起但要认得出来。接着看「Qt 版本」页签qmake 路径应该是D:\Qt\Qt5.1.1\5.1.1\mingw48_32\bin\qmake.exe最后看「构建套件」页签新建或修好一个套件把「编译器」设成刚配的 MinGW 4.8「Qt 版本」设成 5.1.1「调试器」设成Tools\mingw48_32\bin\gdb.exe。三个都填满套件前面才不会有个红叉。还有一个构建目录的选项叫「使用影子构建」。勾上之后编译产物会放到工程目录同级的build-QtOne-Desktop_Qt_5_1_1_MinGW_32bit-Debug这类目录里源码目录干干净净不勾的话.o文件和 Makefile 会直接堆在源码旁边范例工程一多就分不清哪个是哪个。我习惯勾上后面找 exe 也方便。3.3 Qt 5.1.1 没有 windeployqt手动凑齐运行库这一步是版本差异最容易踩的地方。后来的 Qt 5.x 版本里bin目录下有个windeployqt.exe一条命令就能把 exe 依赖的 DLL 全拷过来。但在 5.1.1 的安装目录里翻不到这个工具印象里要到 5.2 之后的包里才开始带。所以照这本书的版本走部署只能手动来。先搞清楚缺哪几个。用 MinGW 编译出来的 Qt Widgets 程序最少需要这些文件文件来源目录作用Qt5Core.dll5.1.1\mingw48_32\bin核心对象、信号槽Qt5Gui.dll同上图形界面基础Qt5Widgets.dll同上控件库libgcc_s_dw2-1.dllTools\mingw48_32\binGCC 运行库libstdc-6.dll同上C 标准库libwinpthread-1.dll同上线程支持platforms\qwindows.dll5.1.1\mingw48_32\plugins\platforms窗口平台插件注意最后那个qwindows.dll必须放在 exe 旁边的platforms子目录里不能和 exe 平铺在一起。少了它程序启动时会报「This application failed to start because no Qt platform plugin could be initialized」错误信息看着像代码问题其实是部署问题。我一般写个小脚本一次拷完省得每次部署都手动拖文件# 在工程根目录执行把运行库和 exe 收拢到 deploy 目录 QTDIR/d/Qt/Qt5.1.1/5.1.1/mingw48_32 MINGW/d/Qt/Qt5.1.1/Tools/mingw48_32/bin OUT./deploy mkdir -p $OUT/platforms for dll in Qt5Core.dll Qt5Gui.dll Qt5Widgets.dll; do cp $QTDIR/bin/$dll $OUT/ # Qt 库本体 done for dll in libgcc_s_dw2-1.dll libstdc-6.dll libwinpthread-1.dll; do cp $MINGW/$dll $OUT/ # 编译器运行库缺了会报 0xc000007b done cp $QTDIR/plugins/platforms/qwindows.dll $OUT/platforms/ cp ./release/QtOne.exe $OUT/ # 换成你自己构建出来的 exe脚本里的QTDIR和MINGW两个变量按实际安装位置改。OUT/platforms这个层级不能省Qt 是按固定目录结构找插件的。跑完把deploy整个目录拷到一台没装过 Qt 的机器上双击能出窗口就说明依赖齐了闪退的话用依赖查看工具看缺哪个 DLL比对着错误弹窗猜快得多。4. 范例工程的 .pro 配置模块开关、qrc 资源与构建目录书里几乎所有范例都是单工程工程配置全在.pro文件里。这个文件是 qmake 的输入几十行但改动它带来的问题往往比写错代码更难查因为报错发生在编译之前。4.1 .pro 文件逐行看QT 里加什么取决于要跑哪一章Qt 5 把库拆成了多个模块用到哪个模块就要在QT 后面加名字不加就会出现「找不到头文件」或者「undefined reference」的链接错误。范例各章节对应的模块大致是这样范例章节涉及功能.pro里要加第 2、3、4 章窗体、控件、对话框core gui widgets第 5 章INI、XML 文件读写core自带QSettings、QtXml第 7 章音视频播放multimedia第 10 章数据库sql第 11 章TCP 聊天、SMTP 邮件network一个典型的.pro长这样QT core gui network sql multimedia xml greaterThan(QT_MAJOR_VERSION, 4): QT widgets TARGET QtOne TEMPLATE app SOURCES main.cpp mainwindow.cpp HEADERS mainwindow.h FORMS mainwindow.ui RESOURCES image.qrcQT core gui是每个工程都要的。greaterThan(QT_MAJOR_VERSION, 4): QT widgets这行的意思是「Qt 主版本大于 4 的时候才追加 widgets」因为 Qt 5 开始控件被单独拆成了 widgets 模块Qt 4 时代没有这个模块。老工程里经常能看到这行照书跑 Qt 5.1.1 的范例基本都保留着。TARGET是生成的 exe 名字TEMPLATE app表示这是个应用程序工程不是库。下面四行列出源文件、头文件、界面文件和资源文件新建文件后如果没自动加进来得手动补否则编译时提示找不到符号。想调试时看到控制台输出加一行CONFIG console想用 C11 语法加CONFIG c11MinGW 4.8 对 C11 的支持已经够用。改完.pro一定要执行一次「构建」→「执行 qmake」让 qmake 重新生成 Makefile。只点运行不重新 qmake改的模块不生效表现出来就是明明加了QT network还是找不到QTcpSocket。4.2 资源文件 qrc图标路径写错是高频翻车点范例 1.4 节改标题栏图标那一段第一步就要建资源文件。流程是项目上右键 → 添加新文件 → Qt → Qt 资源文件 → 起名image.qrc→ 添加前缀默认/new/prefix1→ 添加文件 → 选一张 16×16 的 ICO → 起别名。别名那一步最容易出错。比如图片命名为ico、后缀是.ico代码里就应该写// 引用 qrc 里的资源冒号开头表示从资源系统取不是文件系统 this-setWindowIcon(QIcon(:/new/prefix1/ico));路径分三段:表示资源系统/new/prefix1是前缀ico是别名。三处必须完全对上大小写敏感。常见的三个坑别名里多写了.ico后缀但代码里没写、前缀改过但代码里还是老的、改了 qrc 之后没重新构建。资源文件在编译时会被打包进 exe改完必须重新构建才生效只保存不编译是看不到效果的。4.3 debug/release 与影子构建编译产物到底去了哪Qt Creator 左下角有两个构建模式调试用 debug发布用 release。debug 版带调试符号、体积大、能打断点release 版做了优化体积小给用户的就是这个。切换模式后要重新构建产物在影子构建目录下的debug或release子目录里。找不到 exe 的时候看「项目」页签里的「构建目录」一栏那里写着完整路径。另一个快速办法是编译完成后看「编译输出」面板最后几行链接命令里带着输出文件路径。注意切到 release 模式后第一次构建记得把.pro里可能残留的CONFIG debug删掉两个同时存在时以 debug 为准编译出来的还是调试版。5. 安装与编译常见问题排查四类翻车现场的处理记录下面这四条是我在不同机器上反复遇到的现象看着五花八门根因都在安装和配置环节。按「现象 → 原因 → 解决」记下来下次遇到直接对号入座。5.1 没有编译器Kit 报错的三种成因现象新建工程或打开范例工程点构建弹窗提示「Qt Creator needs a compiler set up to build. Configure a compiler in the kit options.」工程一行代码没改。原因有三种。一是安装时只勾了库没勾Tools下的 MinGW机器上根本没有g.exe二是装了编译器但「构建套件」里的编译器一栏是空的或者指向一个已经不存在的路径三是机器上装过 Visual Studio 的编译器Qt Creator 自动列表里有它但配的是 MinGW 版的 Qt 库编译器和库不匹配。解决先去D:\Qt\Qt5.1.1\Tools\mingw48_32\bin看g.exe在不在。不在就重新跑安装器补装Tools MinGW 4.8。在的话进「工具 → 选项 → 构建和运行」把编译器、Qt 版本、构建套件三处逐个对齐套件上不要留红叉。最后检查「项目」页签里当前工程用的是哪个套件新版 Qt Creator 有时会默认选到别的套件上。5.2 双击 exe 闪退缺 DLL 的定位方法现象IDE 里运行正常把 exe 拷到别的目录或者别的机器上双击黑框一闪就没了或者弹「无法启动此程序因为计算机中丢失 Qt5Core.dll」。原因Qt 程序依赖一堆动态库IDE 运行时会自动带上环境变量里的路径脱离 IDE 就找不到了。另外 5.1.1 没有windeployqt必须手动拷。还有一种情况是把 64 位系统上的 DLL 拷给 32 位程序用报错码0xc000007b本质是位数不匹配。解决按 3.3 节那张表把 DLL 和platforms\qwindows.dll一起拷到 exe 旁边。如果还是闪退打开命令行把 exe 拖进去回车运行错误信息会打在窗口里比双击看到的信息多。再不行用依赖查看工具扫一遍缺哪个补哪个重点看libgcc_s_dw2-1.dll和libstdc-6.dll这两个编译器运行库它们不在 Qt 目录下最容易被漏掉。5.3 中文乱码源文件编码与 Qt5 默认解码现象范例代码里的中文注释打开是乱码或者界面上setText(中文)显示成一串问号、方块。原因Qt 5 默认按 UTF-8 解码字符串而不少老范例文件是 GBK 编码保存的两边对不上就乱。MinGW 4.8 这套工具链对源文件编码也比较敏感同一份文件在不同编辑器里打开可能是两种结果。解决在 Qt Creator 里打开文件「编辑」→「编码」→ 选「UTF-8」→「按编码保存」。如果源文件必须保持 GBK比如引自老工程代码里用本地编码转换// 把本地编码GBK的字符串转成 QString 再显示避免界面乱码 label-setText(QString::fromLocal8Bit(中文内容));fromLocal8Bit告诉 Qt 这段字节按系统本地编码解释转成内部统一的 UTF-16 存储。反过来把 QString 写到文件里给别的程序读用toLocal8Bit()。这组函数在老项目里很常见见到不用奇怪。5.4 多版本共存qmake 指错目录怎么揪出来现象明明在 Qt Creator 里选的是 5.1.1编译时报找不到某个类或者.pro里加的模块不生效或者构建目录名字里出现的是另一个版本号。原因机器上装了多个 Qt构建套件里虽然选了但环境变量 PATH 里排前面的是另一个版本的 bin命令行调用的 qmake 和 IDE 用的不是同一个。另外 Qt Creator 的「Qt 版本」列表会自动扫描残留路径清理不干净时套件可能绑到了失效条目上。解决命令行敲where qmake看输出第一行是不是目标路径不是就把目标路径在 PATH 里上移。然后进 Qt Creator 的「Qt 版本」页签把失效的条目删掉再回「构建套件」重新选一遍。最后清一次构建目录因为 Makefile 里写死了 qmake 的路径不清理的话改完还在用旧的。6. 装完怎么验收五个动作确认这套 Qt 环境真能跑范例装完顺手点一下绿色箭头能出窗口不代表环境就好了。IDE 会替你做很多事把问题藏起来。我的习惯是做一遍脱离 IDE 的验收五个动作走完这套环境能不能拿来跑范例就有答案了。验收项动作通过标准命令行可见新开命令行敲qmake -v输出 Qt version 5.1.1编译器可用敲g --version输出 GCC 4.8.x路径唯一敲where qmake第一行是 D:\Qt\Qt5.1.1 下的路径工程可编译执行 qmake 后跑一次完整构建无 error输出 exe脱离 IDE 可运行exe 拷到新目录双击窗口正常出现图标和中文都正常前三条命令一敲就能出结果重点看第四条和第五条。第四条我一般在命令行里做不经过 Qt Creatorcd /d/QtCode/QtOne qmake QtOne.pro # 生成 Makefile检查有没有模块报错 mingw32-make -j4 # 多线程编译报错会直接指到行号qmake这一步报错问题在.promingw32-make报错问题在代码或头文件路径。分开跑的好处是能立刻判断错在哪一层不用在 IDE 一长串输出里翻。第五条最能暴露问题新建一个空目录把 exe 和 3.3 节那些 DLL、platforms\qwindows.dll一起拷进去双击。窗口出来、图标显示正常、中文不乱码说明依赖齐了、资源打包进去了、编码也对。这一步跑通再把范例源码按章节逐个打开编译哪一章报错就回第 4 章查模块有没有加。从那以后我每装一套 Qt都强制走一遍这个流程先where qmake确认路径唯一再把 exe 拷到没装过 Qt 的机器上双击。血泪经验是凡是省掉这两步的后面都会在某个深夜被一个「找不到 DLL」的弹窗叫回来返工。希望帮到你。本文还有配套的精品资源点击获取