首页 / 资讯中心 / 文章详情

Qt前置学习核心指南:环境、信号槽与构建系统

Qt前置学习核心指南:环境、信号槽与构建系统 ★ FEATURED ARTICLE
1. 前置学习第一步先搞懂 Qt 是个什么东西别急着装环境想学 Qt 的人很多真正坚持下去的没那么多。这段时间后台收到好几条私信问的都是同一件事Qt 前置学习到底要准备什么有人刚学完 C有人打算从 Web 转桌面开发还有人在装环境阶段就被 MinGW 和 MSVC 折腾到想卸载。先说明白这里说的“前置学习”不是让你跑去啃 Qt 源码而是把环境搭建、核心机制、工程构建这三座大山在正式写业务逻辑之前先搬掉。这篇总结就是写给正在准备入坑、以及被环境折磨到怀疑人生的朋友。先说我的结论Qt 前置学习的重点不是某一段代码怎么写而是先把“它是谁、它为什么这样设计、工程怎么组织”这三个问题想清楚。技术更新很快今天学的某个 API 可能明年就 deprecated但框架的设计思想不会变。只要思想通了后面无论是做界面、写工具还是对接第三方库你都会比别人少走很多弯路。1.1 Qt 不是界面库而是一整套跨平台开发框架很多新手容易把 Qt 理解成“一个画界面的库”这和把它理解成 C 的“增强版 STL”一样不准确。Qt 的能力范围远不止 QPushButton、QLineEdit 这些东西。除了我们最熟悉的 Qt Widgets 模块它还覆盖了网络通信QTcpSocket、QNetworkAccessManager、数据库访问Qt SQL、JSON/XML 解析、多媒体处理、并发Qt Concurrent、QThread、绘图引擎QPainter、QChart甚至还有一套完整的 QML/Qt Quick 动态界面技术。如果你把 Qt 仅仅当成“类库”那你的视角就局限在 API 层次。它更像一个“框架”框架规定了你程序的主流程、内存管理方式和事件驱动模型你的代码是嵌入在框架里的而不是框架在你的代码里打杂。举个最直观的例子C 程序通常是从main()开始一路往下执行但 Qt 程序的main()里通常在创建 QApplication 之后调用exec()然后就“卡”在那一行不动了。程序剩下的所有行为都由事件循环来调度。这种控制权的转移就是框架和库的本质区别。对你来说前置学习阶段最重要的一件事就是接受这种“控制反转”的思维方式。不要再问“为什么 Qt 程序不从 main 往下直接走”也不要想着“我要写个 while 循环来控制界面刷新”。后面写信号槽、写定时器、写多线程的时候你会发现所有机制都在为这个事件驱动模型服务。1.2 学 Qt 前需要储备的基础以及新手最容易踩的误区前置学习并不意味着你要从零开始。如果你已经具备以下基础上手速度会快很多C 基础语法类、继承、虚函数、构造函数/析构函数、指针与引用。不用精通模板但至少要能读懂 STL 容器的基本用法。编译与链接的弱基础知道 .h 和 .cpp 是什么、编译和链接各自干吗、动态库.dll和静态库.lib/.a区别在哪。这部分不用深但必须有概念。能看懂英文文档Qt 官方文档质量相当高但更新快中文资料经常滞后。哪怕英语再差也要能查字典看懂类名、函数签名和示例代码。如果你这些还不太熟我的建议是先补两周 C不必等完全学透再动手。很多人觉得必须把 C 全部背完才能碰 Qt这是第一个误区。Qt 用到的 C 特性其实就那几块边做边补完全来得及。第二个常见误区是一上来就弄一堆源码、搞个复杂的项目管理方案结果光编译就折腾几天。前置学习的核心是“跑通”不是“架设大型工程”。你先能把环境搭好、界面弹出来、按钮能响应点击就已经赢过一半人了。第三个误区是贪多。今天看到 QML 炫酷就想学 QML明天看到有人用 Qt Charts 画图又心动。我可以告诉你一个务实的路径做传统桌面工具、配置界面、上位机这类应用优先把 Qt Widgets 吃透想搞动态视觉、复杂交互动画再去学 QML 和 Qt Quick。两者可以并行了解但不要同时深入否则真会被信息淹没。1.3 前置学习阶段怎么安排才不容易半途而废先给自己定一个目标两周时间只做一件事把“环境配置 信号槽 界面布局”这条链路走通。然后每天拆一个小任务。第一天装好环境跑出 Hello World第二到第四天弄明白信号槽的三种写法第五到第七天用 Qt Designer 拖一个小表单把按钮、输入框、列表串起来。不要去碰数据库、网络这些花活前置阶段的目标是建立“手感”。等你把第一条链路走通再按需展开。做工业控制的可以去看串口和绘图做金融工具的可以去看表格模型和 QChart做上位机的可以去看多线程和 TCP。前置学习不是一次性的它是滚动式的——每当你进入一个新领域都要先花时间打通那条领域的“前置链路”。这个思路会一直陪伴你整个 Qt 开发生涯。2. 环境搭建的硬核细节版本、编译器、下载安装一个都不能错环境搭建是 Qt 前置学习里最容易劝退的环节没有之一。我见过太多人卡在编译报错上最后发现只是编译器选错了。这里把版本、编译器、下载安装、Hello World 验证四件事一次说透。2.1 版本选型为什么大家都在问 5.15.26.x 到底能不能学打开搜索引擎见到的第一个热搜词就是“qt 5.15.2 下载安装”。为什么这个版本如此流行因为它是一个极其稳定的长期支持版本LTS兼容性强资料多很多工业级项目都锁死在这个版本上。如果你是为了求职、跟项目、或者做毕业设计5.15.2 是一个相当稳妥的选择。Qt 6 系列已经出了好几年更现代模块划分更清晰官方也在大力推。但 Qt 6 对 C17 的要求更高某些老库和第三方插件还没完全跟上。如果你要对接的设备 SDK、机器视觉库比如 Halcon 这类工业库只提供了老版本的接口用 Qt 5.15.2 会少很多麻烦。我不会劝你非要用哪个我的建议是新手先从 Qt 5.15.2 起步等跑通一个完整小项目再装一个 Qt 6.x 感受差异。两个版本可以共存互不影响。还有一个很现实的问题Qt 官方在线安装器对国内网络不太友好。你可以直接用清华镜像站下载离线安装包或者镜像在线包。注意选“qt-opensource-windows-x86-5.15.2.exe”这类离线安装包下载完后断网都能装。装的时候一定要看清楚组件列表别全选也别漏选。2.2 MinGW 与 MSVC 工具链选错编译器链接期直接教你做人安装 Qt 的时候安装器会问你要装哪些编译器套件常见的有 MinGW 8.1.0 64-bit、MSVC 2019 64-bit 等。这里面的门道足够让新手困惑一整天。简单说MinGW 是 GCC 编译器在 Windows 上的移植版开源免费MSVC 是微软的官方编译器随 Visual Studio 一起提供或通过 Build Tools 单独安装。两者的产物不能混用。你用 MinGW 版本的 Qt 库就必须用 MinGW 编译器编译你的代码你用 MSVC 版本的 Qt 库就得上 MSVC。下载对应软件包时你会看到类似qt\5.15.2\msvc2019_64的路径这个目录名就是“这个 Qt 库是用什么编译器构建的”的身份证。我见过最典型的报错就是有人用 Qt Creator 选了个 MinGW 工具链结果项目却引用了msvc2019_64目录下的库于是冒出来类似:-1: error: dependent ..\..\..\..\..\..\qt\5.15.2\msvc2019_64\include\qtwidgets/qglobal.h这种看不懂的错误。表面上是路径问题本质是编译器体系不匹配。解决思路只有一个保证你使用的 Qt 库构建版本、你的编译器、你后续要拷贝的运行时 DLL 三者完全一致。那么多编译器到底怎么选我的建议是如果只是学习优先装 MinGW 版本。原因很简单安装包自带编译器不需要额外装 Visual Studio上手成本最低。如果你已经装了 Visual Studio 2022或者后续要写需要调用 Windows API、对接 MSVC 编译第三方库的项目那再装 MSVC 版本。Qt 6 官方已经不再提供 MinGW 的某些组件但在 5.15.2 这个版本上MinGW 依然是新手好友。2.3 手把手下载安装离线包、清华镜像、组件勾选第一步从清华镜像站下载qt-opensource-windows-x86-5.15.2.exe。不要下qt-online-installer去在线装在线安装器经常卡在初始化界面非常折磨人。第二步双击安装使用 Qt 账号或选择跳过登录老版本可以跳过遇到强制登录就注册一个。安装路径务必选一个纯英文、不带空格、层级不深的目录比如E:\Qt。不要装在C:\Program Files\Qt否则后续很多脚本和第三方工具会因为路径空格出问题。第三步组件选择页面。如果你是学习用途建议勾选Qt 5.15.2下面的MSVC 2019 64-bit如果你用 VSMinGW 8.1.0 64-bit如果你不想装 VS两个编译器可以都装先用哪个看你心情Qt Creator主程序Qt Debugger Tools调试器排坑必备需要画图的话在Additional Libraries里勾上Qt Charts、Qt Data VisualizationSources组件可选想翻源码的时候再补也不迟安装包体积看着大但其实只是预装了多套编译链和模块真正写代码用不上那么多。装完以后建议把E:\Qt\5.15.2\msvc2019_64\bin或者 MinGW 的 bin 目录加到系统环境变量 PATH 里。这一步很多教程不强调但会导致你在命令行里windeployqt或者运行程序时“运行时找不到 Qt DLL”十分折腾。加完 PATH 记得重启终端。2.4 安装完的第一件事跑通 Hello World 并确认工具链匹配打开 Qt Creator新建一个Qt Widgets Application项目工程路径同样放到纯英文短目录。在构建套件Kit选择那里你会看到类似“Desktop Qt 5.15.2 MinGW 64-bit”和“Desktop Qt 5.15.2 MSVC2019 64bit”两个选项。选哪个取决于你本机装了哪个编译器。如果选了 MSVC 套件却提示找不到cl.exe说明你没装 Visual Studio 的“使用 C 的桌面开发”工作负载或者没装独立的 Build Tools。解决方法是打开 VS Installer勾选这个组件后安装重启 Qt Creator 再试。跑通 Hello World 后先别急着欢呼做一个关键验证在main.cpp里把 Qt 库的类型和编译器版本打印出来看或者直接在构建输出的可执行文件右键属性里看依赖的 DLL。如果程序能跑、按钮点得动、窗口能缩放说明工具链匹配正常。如果启动就崩溃或者报“应用程序无法正常启动 0xc000007b”基本就是 32 位/64 位混了或者运行库缺失。这一套流程走完你的环境地基才算真正打好。很多人在网上问“为什么我 Qt 程序一运行就崩溃”八成都能回溯到这一步出了问题。3. 前置学习的核心机制信号槽、事件循环与对象树环境搞定之后决定你 Qt 水平下限的是对核心机制的理解。这一部分如果你靠死记 API 是学不走的必须把“为什么”想通。我按照重要程度把信号槽、连接方式、事件循环和对象树分开讲透。3.1 信号槽的本质比回调函数多了一层“连接关系”如果你学过观察者模式那信号槽就是它的 Qt 实现。一个对象发送者在某个事件发生时发出一个信号signal另一个对象接收者的槽函数slot被自动调用。和普通回调最大的区别是信号和槽之间不是硬编码的调用关系而是通过connect()函数动态绑定的。一个信号可以被多个槽接收一个槽也可以接收多个信号发送者甚至不需要知道接收者的存在。这种解耦在实际开发里极其舒服。比如你有一个“打开文件”按钮不需要让按钮类直接知道文件处理类怎么写只需connect(openButton, QPushButton::clicked, this, MainWindow::openFile)。后面哪怕把按钮换成快捷键、菜单项只要信号一样槽函数完全不用动。Qt 信号槽有三种写法前置学习阶段最好都掌握。老式写法用SIGNAL()和SLOT()宏字符串匹配编译期不检查写错只是运行时给个警告现在已经不推荐。第二种是函数指针写法比如connect(btn, QPushButton::clicked, this, MainWindow::onBtnClicked)编译期强校验推荐。第三种是用 lambda 捕获局部变量适合写一些简单逻辑注意别在 lambda 里长时间阻塞。说到 lambda顺便提醒一句Qt 5.15.2 对 lambda 的支持已经非常成熟但用的时候要小心生命周期。如果接收对象是this而 lambda 捕获了外部指针一定要确保外部指针比this活得久。这个坑在界面关闭的时候最容易爆窗口析构了线程还在发信号lambda 里的指针已经是野指针直接崩溃。3.2 五种连接方式与跨线程传参原则信号槽的没一个细节都藏在一个容易被新手忽略的参数——连接类型里。connect()可以手动指定Qt::ConnectionType而如果你不指定默认使用Qt::AutoConnection。这个自动连接会在运行时决定发出信号的对象和接收对象在同一线程时使用直连跨线程时使用队列连接。下表我整理给你连接类型默认/手动执行特点AutoConnection默认同线程直连跨线程自动变为队列连接DirectConnection手动发射信号时立即在当前线程执行槽函数QueuedConnection手动槽函数在接收者所在线程的事件循环中排队执行BlockingQueuedConnection手动发射信号后阻塞等待槽函数执行完一般仅用于跨线程同步UniqueConnection手动类似于 AutoConnection但同一个信号槽连接不会重复建立这就是“Qt 信号槽多线程传参数”问题背后的原理。跨线程传参数时信号参数必须通过队列连接传递而队列连接要求参数能被拷贝到事件对象里。所以有两条黄金规则一是自定义类型必须用Q_DECLARE_METATYPE声明、并在首次发射前qRegisterMetaTypeT()注册二是信号参数不要用引用传递尽量按值或者用const T搭配Q_DECLARE_METATYPE。很多人在子线程里发信号传一个QImage或者自定义结构体结果什么都不发生就是因为类型没注册。如果你确实需要在跨线程时传一个不能被拷贝的类型那就别走信号槽用QMetaObject::invokeMethod把任务排到目标线程的队列里或者干脆改用std::function配合QTimer::singleShot(0, ...)调度。总之先想清楚“数据是要跨线程传递的”再去选机制而不是把所有东西硬塞给信号。3.3 事件循环与 QObject 对象树懂这两个才不会写出卡死程序QApplication里的exec()不是什么魔法它是一个巨大的循环从事件队列里取出事件、分发到对应对象、执行事件处理函数、再取下一个事件。为什么你的窗口能对鼠标、键盘作出反应因为所有输入都变成了系统事件放到这个队列里再由事件循环分发。理解事件循环后很多问题就迎刃而解。比如“为什么我界面点个按钮就卡死”你以为按钮失灵了其实是槽函数里做了耗时操作事件循环被堵住了鼠标点击的事件只能在队列里排队界面自然像死机一样。解决方法也不是换“更快的循环”而是把耗时任务放到工作线程或者用QTimer切成小片执行。记住事件循环永远不会并行处理两个任务它的大脑是单线程的。所有让事件循环卡住的操作都会让整个 UI 卡住。第二个重要机制是 QObject 对象树。QObject构造时可以传入一个 parentQt 会把这个对象挂到 parent 的孩子列表里。当父对象析构时会自动析构所有子对象。这也是为什么 Qt 界面代码里很多控件都new出来却不手动delete的原因。省事归省事但你要注意如果一个对象不是new出来的或者它后来又被移到了别的 parent 下原本的自动释放关系就失效了。前置学习阶段最烦的崩溃往往不是不会写而是对象释放的时机没想明白。对象树加上事件循环解释了 Qt 程序的整体骨架main 创建 QApplication创建一个顶层窗口它的 parent 是空指针窗口内部所有子控件构成一棵对象树按钮点击产生事件事件被事件循环分发到对应对象触发关联的信号槽代码在这些环节之间穿梭。你把这个骨架刻在脑子里后面写代码就不会迷路了。4. 工程组织与构建方式qmake 和 CMake 的双轨思路环境会了核心机制理解了接下来是容易被忽略但迟早要面对的工程问题。很多人跟着教程在 Qt Creator 里点“运行”非常顺利一旦想自己加第三方库、写自动化脚本、发布给别人用就会卡住。工程组织这块前置学习阶段不用学太深但底层的构建逻辑必须搞明白。4.1 qmake 与 CMake 怎么选既然官方转向 CMake为什么还要先学 qmake打开 Qt 5.15.2 创建项目你会在向导里看到 qmake 和 CMake 两个选项。Qt 6 官方已经全面转投 CMake新项目默认推荐 CMake。但我还是建议你前置学习阶段先弄懂 qmake再切 CMake。原因很简单qmake 是 Qt 的“亲儿子”。你看网上那些老项目、工业代码、教材大部分用的还是.pro文件。你在 Qt Creator 里新建 Widgets 项目默认构建脚本也是.pro。先把.pro文件里每一行看明白你才好理解工程的基本组成哪些文件参与编译、链接了哪些库、最终要生成什么。CMake 呢更通用适合大型跨平台项目也被大量 C 项目采用。但它和 Qt 之间隔着一层抽象你需要额外指定 Qt 的路径和组件如果没配对报错信息比 qmake 更叫人头大。所以我的建议路径是先用 qmake 跑通两三个小项目把“工程脚本”从陌生变成熟悉再回头看 CMake那时候你已经理解了构建的本质。4.2 从 .pro 到 Makefileqmake 构建流程里每一步在干什么一个最简的 Qt Widgets 工程.pro文件大概长这样QT core gui widgets TARGET MyApp TEMPLATE app SOURCES main.cpp \ mainwindow.cpp HEADERS mainwindow.h FORMS mainwindow.uiQT core gui widgets表示这个工程要用 Qt 的哪些模块。注意如果你用到 Qt Charts这里要写QT charts否则链接的时候会报找不到符号。TARGET是生成的可执行文件名TEMPLATE app说明最终产物是应用程序如果是动态库就写lib静态库写subdirs可以管理多子项目。你在 Qt Creator 里点构建时qmake 会根据.pro文件生成对应的 MakefileMSVC 下是nmake用的 MakefileMinGW 下是mingw32-make用的 Makefile然后调用 Make 工具编译。很多人把“Q Make”理解成了“Quick Make”其实它更像“Qt Make”——专门用来为 Qt 工程生成 Makefile 的工具。qmake 还会自动处理 moc 元对象编译器、uic把.ui文件转成 C 头文件、rcc把.qrc资源文件编进二进制这些工具链。后续你想给工程引第三方库比如调用 Halcon就是两行的事INCLUDEPATH C:/ProgramFiles/HALCON-xx/include LIBS -LC:/ProgramFiles/HALCON-xx/lib/x64-win64 -lhalcon注意路径里不要有空格路径分隔符用斜杠库名写法根据编译器略有差异MinGW 用-lhalconMSVC 也可以直接写绝对路径。你只要记住INCLUDEPATH 解决“头文件找不到”LIBS 解决“库符号找不到”。这两个错了就会看见红得刺眼的fatal error: halcon.h: No such file or directory或者cannot open input file halcon.lib。4.3 CMake 里怎么引用 QtCMAKE_PREFIX_PATH 和 Qt6 的组件化切到 CMake 后一个最小工程的CMakeLists.txt长这样cmake_minimum_required(VERSION 3.16) project(MyApp VERSION 1.0 LANGUAGES CXX) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) find_package(Qt5 5.15.2 REQUIRED COMPONENTS Widgets) add_executable(MyApp main.cpp mainwindow.cpp ) target_link_libraries(MyApp PRIVATE Qt5::Widgets)注意里面最关键的是find_package。它之所以能找到 Qt是因为 CMake 需要知道 Qt 库的安装位置。如果你不在 CMakeLists 里写路径就得在命令行里加cmake -DCMAKE_PREFIX_PATHE:/Qt/5.15.2/msvc2019_64 ..CMAKE_PREFIX_PATH就是告诉 CMake “去哪个目录找 Qt 的 CMake 配置”。在 Qt 6 里写法稍有变化比如find_package(Qt6 REQUIRED COMPONENTS Widgets)但思想完全一样。你在 Qt Creator 里新建 CMake 项目时Qt Creator 会自动帮你填好这个路径一旦你脱离 Qt Creator用命令行构建就轮到它给你报错了。所以你可以事先理解这一点遇到类似问题不至于慌。qmake 和 CMake 不是零和博弈。你可以用 Qt Creator 把同一个小项目分别用.pro和CMakeLists.txt各建一次对比一下文件内容。这个过程会让你对“构建系统”的理解瞬间提升一截也顺便获得“谁在背后帮你干活”的全局视角。4.4 Qt 命令行工具moc、uic、rcc、windeployqt 各管什么顺带把 Qt 的几个命令行工具一起说了因为它们早晚会出现在你的构建输出栏里。moc元对象编译器专门处理带有Q_OBJECT宏的类。它把信号槽映射等信息生成额外的 C 源文件所以你在头文件里写了Q_OBJECT却不能只编译头文件必须让 moc 参与。uic把 Qt Designer 保存的.ui文件转成ui_xxx.h头文件。你手写的界面代码和拖出来的界面最终是一个东西。rcc把.qrc资源文件里收集的图片、字体、翻译文件编译成二进制数据嵌入程序。好处是发布的时候不用带一堆资源文件坏处是资源改了以后必须重新编译。windeployqt发布工具的明星。使用方式是在 release 模式下构建好 exe 后打开命令行切到 exe 目录执行windeployqt app.exe它就会把 Qt 依赖的 DLL、插件、平台文件统统拷到旁边。必须强调windeployqt 要用和你的编译器匹配的版本。你在 MinGW 的 bin 目录下找到一个 windeployqt在 MSVC 的 bin 目录下也有一个。拿 MinGW 的去部署 MSVC 编译的程序轻则缺 DLL重则平台插件不识别程序双击就闪退。发布之前最好先把debug模式改成release再用 release 版 exe 跑一次 windeployqt。5. 前置阶段高频问题排查与避坑实录最后把我在实际项目里踩过、也帮别人排查过的一堆高频问题做个速查。很多坑不是你的代码逻辑错了而是机制理解不到位或者环境配置有问题。5.1 信号槽多线程传参数的经典坑自定义类型注册问题我之前写过一个小工具里面有一个后台线程负责采集数据然后通过信号把自定义结构体传给界面线程显示。代码看着没毛病信号也触发了但槽函数就是不执行。调试了半天才发现自定义类型没有用Q_DECLARE_METATYPE声明也没有qRegisterMetaType注册。队列连接要求参数类型是已知的“元类型”否则事件在派发时直接丢弃静静悄悄什么都不报。解决办法非常固定。定义结构体时在外部加一行声明struct MyData { qint64 timestamp; double value; }; Q_DECLARE_METATYPE(MyData)然后在信号第一次发射之前构造函数最稳妥调用qRegisterMetaTypeMyData(MyData);如果你在 Qt 5 里用了QueuedConnection传QImage、QByteArray这类 Qt 自有类型它们是内置元类型不用额外注册。但如果你自己定义的东西没注册排查优先级排第一。另外一个容易被忽略的点是跨线程传递复杂对象时信号参数尽量按值传别用引用。因为队列连接需要把参数拷贝一份引用在跨线程场景下语义非常危险。5.2 编译报错和崩溃问题的排查思路先怀疑路径再怀疑编译器最后怀疑代码编译报错是每个 Qt 新手的日常。像:-1: error: dependent ..\..\..\..\..\..\qt\5.15.2\msvc2019_64\include\qtwidgets/qglobal.h这类错误第一反应不应该是去改代码而是看路径。这个报错的根源通常有两个一个是你把项目放在了层级特别深的目录Qt Creator 解析依赖时生成了很长一串..另一个是你的 Qt 安装路径或项目路径里有空格、中文或符号。解决思路把项目挪到C:\qtpro\demo这种浅层纯英文目录重新构建基本就好了。再就是“编译通过运行就崩溃”的经典情况。你可以在 Qt Creator 左下角把构建模式切到 Debug跑起来后按 F5 启动调试器崩溃时会停在出错的那一行是最省力的定位方式。如果你看到类似QObject::startTimer: Timers can only be used with threads started with QThread说明 QTimer 和线程没配合好。如果你看到0xc0000005访问冲突多半是野指针、悬垂指针或者跨线程传递了失效参数。排查崩溃时我的固定顺序是先看异常发生地是哪个文件哪一行再看当前调用栈重点查“被 delete 的对象是否还在发信号”“lambda 里捕获的指针还活着吗”“自定义类型是否注册”。这三个占掉了 Qt 崩溃问题的大头。用排除法把环境因素去掉以后再慢慢抠业务逻辑。5.3 界面设计与文件操作的高频操作Qt Designer 和几个小技巧说到 Qt Designer很多新手拖控件的时候不知道.ui文件其实是要经过uic处理的。你在 Designer 里改完界面回到 Qt Creator 构建后界面才更新。如果是纯代码写界面那一切以代码为准。另一个高频操作是“qt 获取文件信息”用QFileInfo就能解决QFileInfo info(D:/test/config.txt); qDebug() info.fileName(); // config.txt qDebug() info.absoluteFilePath(); // D:/test/config.txt qDebug() info.suffix(); // txt qDebug() info.size(); // 文件大小 qDebug() info.lastModified(); // 最后修改时间路径分隔符建议统一用正斜杠/Windows 下 Qt 能正确识别还避免转义符问题。至于“qt double 转字符串”新手最容易记混的有三个写法直接列出来double val 3.1415926; QString s1 QString::number(val, f, 2); // 3.14 QString s2 QString::asprintf(%.2f, val); // 3.14 QString s3 QString(%1).arg(val, 0, f, 2); // 3.14如果没有指定格式QString::number(val)默认保留标准精度可能得到3.14159。要注意arg的占位符是%1、%2不是 C 风格里的%s混用会导致意料之外的输出。能在前置学习阶段把这些记清楚后面写数据展示界面会顺很多。5.4 发布打包windeployqt 别用错版本也别把 debug 当 release 用发布这块值得单独提醒。很多人程序在自己电脑上跑得好好的拷给别人就报“缺少 Qt5Widgets.dll”或者“无法定位程序输入点”。原因无非两类一是没有用windeployqt收集依赖二是收集了但用错了版本。操作步骤我建议固定成这样确保程序是 Release 模式构建。没人会把 Debug 版带一堆调试信息发出去的。找到构建目录下release子目录里的 exe 文件。打开对应编译器版本的命令行MinGW 或 MSVC切到 exe 目录。执行windeployqt 你的程序名.exe。等它输出一堆 “Adding Qt5Widgets.dll” 之类的信息后把整个 release 目录压缩发给别人。如果你发现部署完以后双击还是没反应先检查一下同目录下有没有platforms文件夹里面有qwindows.dll。没有这个文件的 Qt 程序在 Windows 上根本起不来。还要注意有些第三方库的 DLL 不会自动收集需要你手动从外部拷贝到 exe 目录。最后做一次“干净测试”找一台没装 Qt 的电脑或者直接把 Qt 相关目录从 PATH 里去掉再运行。发布阶段还有一个高级话题叫“静态编译”就是把 Qt 库直接编进 exe 里不需要一堆 DLL。Qt 5.15.2 官方安装包不直接给静态库要自己用源码编译而且有商业授权问题前置学习阶段不建议碰。先用windeployqt把动态发布搞明白以后有需要再说。我个人的体验是Qt 前置学习很像打地基最无聊、最不显眼但决定后面所有楼层的稳定程度。你要是准备三个月内做出一个能看的桌面工具那这期间最该花精力的不是抄界面而是把环境、信号槽、构建这三板斧磨利。真到了写业务逻辑的时候你会发现之前这些“前置功课”全都用得上。
阅读完成 · 觉得有帮助?
咨询建站