资讯详情

Qt5.1.1+MinGW开发环境配置与范例避坑指南

📅 2026/10/29 11:14:40 | 华诺云谱 👁 阅读
Qt5.1.1+MinGW开发环境配置与范例避坑指南
简介《Qt5范例开发大全完整目录版》PDF面向C与Qt5开发者覆盖从开发环境搭建到打包部署的完整学习路径适合初学者按章入门也便于有经验开发者查阅实例思路。内容以14章组织依次涉及Qt Creator与Hello World、窗体创建及大小位置控制、常用控件与横向网格布局、日历与登录等组件、文件读写与删除、图形图像和多媒体、系统操作与注册表、数据库基础、网络开发、进程与线程、数据安全及跨平台发布部署。资源包共1个PDF文件约2.84MB完整目录版层级清晰便于按知识点快速定位减少检索成本。已有2459人学习可作为Qt5桌面应用开发的系统参考帮助读者理解界面设计、事件处理、数据持久化与打包发布等关键环节对GUI开发常见模式形成整体认知并积累可迁移的工程实践方法。1. 版本先对齐Qt5 范例为什么必须配 5.1.1 这套老环境前阵子帮人恢复一个 C 写的串口小工具源码通篇 Qt5 写法我图省事装了最新在线安装器qmake 一跑头文件和模块名挨个报错改到第三个小时还是不如重装。这类事在 Qt5 范例上太常见了《Qt5范例开发大全》这本 PDF 是照着 5.1.1 写的你拿 5.15 甚至 6.x 去开模块拆分、API 签名、构建套件三层全对不上书上第 3 章的控件代码可能一行都编不过。所以这套环境的关键不是装最新而是装对版本。适合手上有一份 Qt5 时代源码要维护、或者拿这份范例目录当练习册从控件一路练到打包部署的 C 开发者Windows 平台能接受命令行。2. 装 Qt Creator 与 MinGW离线包里每个勾选项的去向Windows 上装 Qt 一般有三条路在线安装器、离线全量包、发行版自带的包管理器版本。这本 PDF 针对的是第二条路——666MB 的 offline 包文件名qt-windows-opensource-5.1.1-mingw48_opengl-x86-offline.exe。名字很长但每一段都是信息5.1.1 是 Qt 库版本mingw48 是随包的编译器版本opengl 是图形后端x86 表示 32 位offline 意味着组件全在包里断网、拷到内网机器上都能装。2.1 为什么这套环境要选 offline 全量包而不是在线安装器在线安装器只给你最新版本老版本组件经常下架装到一半还得等下载。更麻烦的是它默认拉的是当前稳定版你根本选不回 5.1.1。离线包的好处是版本固定、可重复、可拷贝——三台机器装出来一模一样出了事好对比。编译器这层有两个选择MinGW 和 MSVC。这本书给的是 MinGW 4.8原因是它随包自带你不用额外装 Visual Studio 和 Windows SDK缺点是编出来的 exe 会依赖 MinGW 运行时 DLLlibgcc_s_dw2-1.dll、libstdc-6.dll这一类分发时得一起带上。MSVC 版则依赖对应年份的 VC 运行时很多目标机器上是没有的装起来更啰嗦。跟着范例走的人MinGW 更省事。为什么是 32 位5.1.1 时期官方 Windows 包以 32 位为主64 位要么自己编译要么找非官方构建。32 位程序在 64 位 Windows 上照样跑进程内存上限低一些跑范例这种规模的项目完全够。至于 OpenGL 版第 6 章图形图像里那些绘制、缩放、阴影效果主要走 QPainter用不上硬件加速但如果后面要碰 QGLWidget 之类的类选 OpenGL 版少一道坑。2.2 安装向导走一遍安装路径、组件勾选、文件关联下载完先别急着双击。右键以管理员身份运行尤其是打算装到Program Files下面的时候否则后面写注册表、装组件可能被拦。第一步欢迎界面直接下一步。第二步是安装路径这里是全程唯一必须动脑的地方路径里不能有中文、不能有空格、不能有括号。我给的建议是D:\Qt\Qt5.1.1短、纯 ASCII、跟书里的示例路径对得上。原因不是玄学是 MinGW 那套 make 对带空格的路径处理很差你早晚会撞上No rule to make target这种看起来毫无道理的报错。第三步组件选择勾这几项Qt 5.1.1下的MinGW 4.8 32 bit—— 必须勾这是 Qt 库本体Tools下的MinGW 4.8—— 必须勾这是编译器不勾后面建项目找不到 gSources—— 可选占几百兆好处是能 F2 跳进 Qt 源码看实现第 3 章讲控件的时候挺有用第四步许可协议全选第五步开始菜单名字随便第六步等几分钟。装完之后目录大概长这样可以先对一眼D:\Qt\Qt5.1.1\ ├─ 5.1.1\mingw48_32\ # Qt 库本体 │ ├─ bin\ # qmake.exe、Qt5Core.dll 等 │ ├─ include\ # 头文件 │ ├─ lib\ # .a 静态库和 .dll.a 导入库 │ └─ plugins\ # 平台插件、数据库驱动、图片格式 ├─ Tools\mingw48_32\ # 编译器 │ └─ bin\ # g.exe、gdb.exe、mingw32-make.exe └─ Qt Creator\bin\ # IDE 本体这个结构要记住两件事qmake在5.1.1\mingw48_32\bin下编译器g在Tools\mingw48_32\bin下两者不在同一个目录。后面配 PATH、配构建套件都靠这两条路径。2.3 装完先验三件事qmake、编译器、构建套件别急着新建项目。先开一个普通命令行窗口把三个可执行文件点名验一遍# 1. qmake 在不在报不报得出 Qt 版本 D:\Qt\Qt5.1.1\5.1.1\mingw48_32\bin\qmake.exe -v # 2. 编译器在不在架构对不对 D:\Qt\Qt5.1.1\Tools\mingw48_32\bin\g.exe -v # 3. make 在不在MinGW 里它叫 mingw32-make D:\Qt\Qt5.1.1\Tools\mingw48_32\bin\mingw32-make.exe -vqmake -v的正常输出是两行第一行QMake version 3.0第二行Using Qt version 5.1.1 in D:/Qt/Qt5.1.1/5.1.1/mingw48_32/lib。如果第二行指向的不是你刚装的目录说明机器上还有别的 Qt这不是小问题后面会单独讲。g -v输出里要能看到gcc version 4.8.x和Target: mingw32。然后是 IDE 这一层。打开 Qt Creator菜单 工具 → 选项 → 构建和运行 → 构建套件Kit看列表里有没有一个名字类似Desktop Qt 5.1.1 MinGW 32bit的条目。重点看三列编译器选的是不是MinGW 4.8 32bit调试器指向的是不是Tools\mingw48_32\bin\gdb.exeQt 版本是不是Qt 5.1.1 (5.1.1)。如果这个 Kit 前面的图标带红色感叹号或者干脆是灰色的说明上面三条路径有哪一条没被识别到。这时候不要硬着头皮建项目先去 工具 → 选项 → 构建和运行 → 编译器 手动 Add 一个 MinGW把g.exe和gcc.exe分别指过去再回来重新选。这一关卡住的人特别多表现出来就是新建项目点构建没反应或者构建按钮是灰的。3. 配 PATH 与第一个 Hello World让窗口真的弹出来3.1 PATH 里那一段写错一个分号就白干书里 1.2 节最后一步是配环境变量系统变量Path里追加D:\Qt\Qt5.1.1\5.1.1\mingw48_32\bin并且特意提醒前面的分号。为什么非要配这一段因为 Qt 程序编译出来是个 exe但 exe 本身不带界面能力运行时要去加载Qt5Core.dll、Qt5Gui.dll、Qt5Widgets.dll这几个文件就在这个 bin 目录里。PATH 里有它你在资源管理器里双击 exe 才不报找不到 Qt5Core.dll。在 Qt Creator 里点绿色三角能跑、双击 exe 就报错原因就在这里Creator 启动子进程时会自己往环境里注入构建套件的路径你那双击的那一下不走这条路。Win7 和 Win10 以后的写法不太一样。Win7 是分号分隔的一整串文本框追加的时候必须自带分号写成;D:\Qt\Qt5.1.1\5.1.1\mingw48_32\binWin10 之后环境变量编辑器改成了列表直接新建一行贴上路径就行手动再写分号反而会变成路径的一部分那就真白干了。配完必须新开一个命令行窗口验证老窗口读的是旧环境# 能输出路径说明 PATH 生效了 where qmake # 再确认一次指向的版本对不对 qmake -v如果where qmake输出了两条不同的路径说明机器上装过别的 Qt。这时候 PATH 里谁在前面谁生效顺序错了就会出现代码是对的、编出来行为不对的情况属于典型的玄学问题排查半天发现是版本串了。3.2 三种基类怎么选QMainWindow、QWidget、QDialog新建项目文件 → 新建文件或项目 → 应用程序 → Qt Gui 应用 → 选择。填完项目名和路径之后会停在一个叫类信息的页面上面有三个基类下拉项。这一步选错后面第 2 章窗体和第 4 章组件的很多代码直接贴不进去所以我一般会先看一眼要跟哪一章的范例。基类自带结构典型用途对应范例章节QMainWindow菜单栏、工具栏、状态栏、中央部件主程序窗口第 3 章 QMenu、QToolBarQWidget无最轻自定义面板、嵌入式控件、无边框窗体第 2 章窗体应用QDialog默认按钮区、可返回结果登录框、文件浏览对话框第 4 章登录窗口QMainWindow 适合做主窗口因为它已经给你留好了菜单条、锚接窗口和状态条的位置中间那块叫中央部件你往里塞什么都行。QWidget 是所有界面对象的基类最裸第 2 章讲移动无边框窗体那种去掉标题栏的玩法用它最直接。QDialog 是对话框基类专门做短期交互任务第 4 章那个登录窗口就是它的典型场景因为它支持模态、支持返回一个值给调用方。3.3 main.cpp 与 mainwindow.cpp 逐行拆建完项目Creator 会自动生成三个代码文件加一个 .pro。先看入口// main.cpp #include mainwindow.h #include QApplication int main(int argc, char *argv[]) { QApplication a(argc, argv); // 每个 Qt GUI 程序有且只有一个负责事件分发 MainWindow w; // 在栈上创建主窗口程序退出时自动析构 w.show(); // 显示窗口到这一步才真正创建窗口句柄 return a.exec(); // 进入事件循环程序阻塞在这里直到窗口关闭 }argc和argv原样传给 QApplication它需要读命令行参数比如-style这类a.exec()是事件循环鼠标点击、键盘输入、重绘全在这个循环里派发去掉它窗口一闪就没了。然后是窗口本身// mainwindow.cpp #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, 40, 160, 30)); // x、y、宽、高 }QRect那四个参数前两个是控件左上角相对于父窗口客户区的坐标后两个是控件的宽和高。很多人第一次写会以为是左下角到右上角画出来位置偏移一大截。new QLabel(this)里的this是重点。Qt 有一套对象树机制指定了父对象的控件会在父对象析构时被自动 delete所以你不需要、也不应该再手写delete label。写了反而可能二次释放程序在关窗的时候崩掉现场看起来跟这段代码毫无关系。这是纯 C 习惯带到 Qt 里最容易翻车的一处。3.4 从 Hello World 往前一步窗体大小、位置、图标第 2 章的范例都是在这个 Hello World 上加东西改起来就几行// 1.2 控制窗体大小最大最小都设成 300用户就拖不动了 this-setMaximumSize(300, 300); this-setMinimumSize(300, 300); // 1.3 初始位置与背景色不写 move 的话窗体默认居中 this-move(100, 100); this-setStyleSheet(background:red);setStyleSheet是 Qt 的样式表语法接近 CSS改颜色、改边框、改圆角都靠它比自己去重写 paintEvent 省事得多。第 2 章那几个改背景色、改字体形状的例子基本都是这个套路。改标题栏图标要多一步先准备一个 16×16 的 ICO 文件放进项目目录下的resource文件夹然后 项目右键 → 添加新文件 → Qt → Qt 资源文件命名image.qrc打开它添加前缀/new/prefix1添加文件选中那个 ICO最后给它起个别名比如ico。代码里这样引// :/ 开头表示走资源系统不是磁盘路径 this-setWindowIcon(QIcon(:/new/prefix1/ico));路径规则是冒号斜杠 前缀 别名。如果你在添加文件那一步没起别名那就得写文件全名带后缀两种写法混着用是报图片加载失败的最常见原因。资源文件里的东西会被编进 exe好处是分发时不用带一堆图片坏处是换图必须重新编译。4. 按范例目录补模块.pro 里 QT 到底加什么这本 PDF 从第 3 章控件一路排到第 14 章打包部署几乎每换一章就要动一次.pro。Qt5 是模块化设计好处是编出来的程序体积可控副作用是你用了某个类却没加对应模块时报的错是一堆未定义标识符或者无法解析的外部符号跟模块名毫无关系。这一章按目录顺序把该加的模块捋一遍。4.1 控件与布局不用加模块但要认 uic 和 moc第 3 章从 QPushButton 到 QTabWidget 二十多个控件加上 QHBoxLayout、QGridLayout 两种布局全在 QtWidgets 模块里新建项目默认就有QT core gui greaterThan(QT_MAJOR_VERSION, 4): QT widgets TARGET Qt01 TEMPLATE app SOURCES main.cpp \ mainwindow.cpp HEADERS mainwindow.h FORMS mainwindow.uigreaterThan那一行是兼容 Qt4 和 Qt5 的写法Qt5 把 widgets 从 gui 里拆出来了这行在 5.1.1 下会展开成QT widgets。FORMS那行告诉 qmake 这个项目有 .ui 文件构建时会自动调uic把 XML 转成ui_mainwindow.h。HEADERS里有Q_OBJECT宏的头文件会被moc处理成moc_xxx.cpp信号槽才能工作。这两步是自动的但你要知道它们存在因为一旦.pro里少写了一行HEADERS症状是槽函数写了但没被调用控制台打一行No such slot查半天查不出原因。信号槽连接有新旧两种写法5.1.1 都支持// 老写法编译期不检查写错了运行时才报 connect(ui-btnClose, SIGNAL(clicked()), this, SLOT(close())); // 新写法编译期就能查出来函数名拼错 connect(ui-btnClose, QPushButton::clicked, this, MainWindow::close);跟着书上的范例走你会看到大量老写法能跑但建议自己动手时换新写法省掉一类低级错误。4.2 文件、INI、XMLQFile、QSettings、QtXml 三条路第 5 章讲创建文件夹、写文件、改内容、删除、改名再加上 INI 和 XML 读写。文件夹和文件全在 core 模块不用加东西#include QDir #include QFile #include QTextStream QDir dir(D:/demo); if (!dir.exists()) dir.mkpath(.); // 递归创建返回 bool失败要判 QFile f(D:/demo/log.txt); if (f.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Append)) { QTextStream out(f); out.setCodec(UTF-8); // 不设的话中文按本地编码走换机器就乱 out hello endl; f.close(); }QIODevice::Text在 Windows 下会把\n自动转成\r\nAppend是追加模式不写就是覆盖这两点搞混了会出现日志只剩最后一行的问题。INI 文件用 QSettings 更省事但有一个坑必须提前说#include QSettings // 必须显式指定 IniFormat否则 Windows 下会写到注册表里去 QSettings ini(D:/demo/config.ini, QSettings::IniFormat); ini.setValue(db/host, 127.0.0.1); ini.setValue(db/port, 3306); ini.sync(); // 不 sync 的话进程异常退出可能丢数据之所以强调这个是因为第 9 章整章讲注册表读写本质上就是 QSettings 走NativeFormat——Windows 下默认写到HKEY_CURRENT_USER\Software\组织名\应用名下面。同一个类构造参数不同落盘位置完全不一样。想写文件就得显式传IniFormat。XML 在第 5 章末尾两节.pro里加QT xml加上之后可以用QDomDocument做树形读写。不过 Qt5 里还有一个QXmlStreamReader在 core 模块里流式解析、不需要额外模块、内存占用小读大文件我更愿意用它。书上用 DOM 是因为写起来直观知道有两条路就行。4.3 图形图像与多媒体gui 之外的 multimediawidgets第 6 章那一长串——绘制文字、线条、椭圆、静态图、动态图、水平移动、翻转、缩放、图中加文字、扭曲、模糊、着色、阴影、透明——绝大多数是 QPainter 加 QImage 的活都在 gui 模块里不用动.provoid MainWindow::paintEvent(QPaintEvent *) { QPainter p(this); p.setRenderHint(QPainter::Antialiasing, true); // 抗锯齿斜线不毛刺 p.drawLine(10, 10, 200, 10); p.drawEllipse(20, 30, 120, 80); p.drawText(rect(), Qt::AlignCenter, Qt5); }重写paintEvent是这一章的核心套路窗口需要重绘时 Qt 会调它你在里面画就行。注意别在里面做耗时操作它可能被高频调用。模糊、着色、阴影这几个效果纯 QPainter 硬啃代价很大Qt5 里更常见的做法是挂QGraphicsBlurEffect、QGraphicsDropShadowEffect到图元上或者对 QImage 逐像素处理。这一章的目的是让你看到效果不是让你自己实现算法。第 7 章多媒体要单独加模块QT multimedia multimediawidgetsmultimedia是播放核心QMediaPlayermultimediawidgets提供显示视频的控件QVideoWidget两个都得加只加前一个会报找不到 QVideoWidget。5.1.1 在 Windows 上的多媒体后端走 DirectShow机器上缺对应解码器的视频文件放不出来这不是代码问题换个 mp4 或者装解码器都能验证。那一章 1.2 节讲播放 Flash 动画走的是 QWebView 加载插件那条路。这条路现在基本走不通了跳过不影响后面任何一章别在这上面耗时间。4.4 数据库、网络、线程sql / network / concurrent 的加法第 10 章数据库QT sql#include QSqlDatabase #include QSqlError #include QSqlQuery #include QDebug QSqlDatabase db QSqlDatabase::addDatabase(QSQLITE); db.setDatabaseName(demo.db); if (!db.open()) { qDebug() 打开失败: db.lastError().text(); // 一定要打不然只剩打不开 return; } QSqlQuery q(db); q.exec(CREATE TABLE t(id INTEGER PRIMARY KEY, name TEXT));排查数据库问题第一步永远是QSqlDatabase::drivers()把可用驱动打出来。5.1.1 的 MinGW 包里一般有QSQLITE和QODBC前者是文件数据库后者靠系统 ODBC 数据源书上 1.2 节连 Access 走的就是 QODBC。驱动列表里没有说明plugins\sqldrivers目录没被找到跟代码无关。第 11 章网络QT networkQTcpServer和QTcpSocket做点对点聊天1.1、1.2 节QUdpSocket做局域网广播1.3 节。1.4 节的 SMTP 发邮件 Qt 没有内置类实际是按协议用 QTcpSocket 一条条写命令书上给的也是这个思路。第 12 章线程QThread直接可用QRunnable配合QThreadPool也不用加模块但QtConcurrent那套要加QT concurrent第 13 章数据安全MD5 在 core 里自带不用加模块#include QCryptographicHash QByteArray md5(const QByteArray src) { return QCryptographicHash::hash(src, QCryptographicHash::Md5).toHex(); }AES 不在 Qt 内置里得引第三方库或者自己接 OpenSSL。书上那节给的是调用现成实现的思路跟着抄能跑但要知道这不是 Qt 官方 API换机器注意动态库。5. 避坑与排查这套环境里最容易翻车的五处5.1 编译与运行阶段的三个坑坑一Creator 里能跑双击 exe 报丢失 Qt5Core.dll现象同一个项目点绿色三角正常弹窗去debug目录双击 exe 就弹错误框说计算机中丢失 Qt5Core.dll。原因Creator 启动子进程时会注入构建套件的环境变量PATH 里临时加上了mingw48_32\bin资源管理器双击走的是系统 PATH没配过就找不到。解决按 3.1 节把D:\Qt\Qt5.1.1\5.1.1\mingw48_32\bin加进系统 PATH然后重开命令行和资源管理器窗口旧的进程读的还是旧环境。临时验证的话直接把这几个 DLL 拷到 exe 旁边也能跑但别养成习惯。坑二编译报 No rule to make target .../mainwindow.ui现象项目从别的目录拷过来或者改过文件夹名字一构建就报这一句指向的文件明明存在。原因.pro.user里存的是绝对路径路径一变就对不上qmake 生成的老 Makefile 也还在。解决先把项目目录下的xxx.pro.user删掉重新打开项目让 Creator 重新生成还不行就 构建 → 执行 qmake再不行 构建 → 清理项目。这套三步走我一般按顺序试八成能解决。坑三中文显示成方块或者问号现象setText(你好)编出来界面上是乱码。原因源文件保存编码和 QString 解释const char*时用的编码不一致。Qt5 里QString从const char*构造默认按 UTF-8 解释而 Qt4 时代是按 Latin-1很多人带着 Qt4 的习惯写 Qt5源文件存的是 GBK就乱了。解决源文件统一另存为 UTF-8还不行就把字符串包一层QString::fromLocal8Bit(你好)或者QStringLiteral。项目里编码要统一混着来最难受。5.2 打包与跨机器运行的坑坑四拷到别人电脑上提示缺 libgcc_s_dw2-1.dll现象自己机器一切正常发给同事对方双击提示缺 MinGW 运行时 DLL。原因MinGW 编译出来的程序依赖它自己的运行时这些 DLL 只存在于装了 Qt 和 MinGW 的机器上。解决把它们和 Qt 的 DLL 一起拷到 exe 旁边。想省事可以在.pro里加QMAKE_LFLAGS -static-libgcc -static-libstdc静态链接体积会大一些但不依赖外部文件。第 14 章用 FilePacker 打包、用 Inno Setup 做安装包本质上就是把这些依赖收拢起来别漏。坑五报 no Qt platform plugin could be initialized现象exe 拷到干净机器上弹一个框让你重装应用提示平台插件加载失败。原因Qt5 把平台相关的东西抽成了插件Windows 下需要platforms\qwindows.dll这个文件在mingw48_32\plugins\platforms下。只拷了 Qt5Core、Qt5Gui、Qt5Widgets 是不够的。解决在 exe 同级建一个platforms文件夹把qwindows.dll放进去。如果还要显示中文、读 jpg那就还得带上imageformats目录。第 14 章打包那一节的核心就是把 plugins 下这几个子目录理清楚漏一个就在干净机器上翻车。6. 装完怎么验证用一个自检小程序把整条工具链跑一遍环境装完书上第 1 章那个 Hello World 能弹窗只能说明最小路径通了。真到第 4 章、第 10 章、第 11 章你要用多媒体、数据库、网络模块没配好照样卡。所以我一般会先建一个专门的自检项目把版本、路径、模块、驱动一次性打出来比挨个章节试错快得多。新建一个 Qt Gui 应用.pro里把常用模块全加上QT core gui sql network multimedia CONFIG console # 保留控制台窗口qDebug 才看得到输出主函数里把这些信息全打一遍#include mainwindow.h #include QApplication #include QDebug #include QSysInfo #include QLibraryInfo #include QSqlDatabase #include QMediaPlayer int main(int argc, char *argv[]) { QApplication a(argc, p a hrefhttps://download.csdn.net/download/youqingyike/12838932 stylecolor:#ec7500;font-size:14px; 本文还有配套的精品资源点击获取 /a img altmenu-r.4af5f7ec.gif srchttps://csdnimg.cn/release/wenkucmsfe/public/img/menu-r.4af5f7ec.gif stylewidth:16px;margin-left:4px;vertical-align:text-bottom;cursor:text; /p
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑