Qt框架与项目结构.md 3.9 KB


title: Qt框架与项目结构 tags:

  • module
  • qt
  • project
  • joplin type: module source_type: reconstructed created: 2026-04-23 updated: 2026-04-23 ---

Qt框架与项目结构

[!abstract] 这一模块处理 Qt 程序“怎么开始”的问题,包括框架定位、项目文件、入口函数、资源系统以及构建工具切换。

模块结论

  • Qt 的核心价值是跨平台 GUI 框架,但真正支撑它的是对象模型、事件循环和统一构建组织。
  • 一个最小 Qt 应用至少要有 QApplication、顶层窗口对象和事件循环 exec()
  • .proCMakeLists.txt 不只是构建脚本,而是对模块依赖、源文件、资源和目标产物的声明。
  • 资源文件 qrc 的作用是把图片等静态资源纳入应用内部引用体系,避免依赖外部散落路径。

一、Qt 的框架定位

  • Qt 面向桌面 GUI,但也覆盖跨平台应用开发、资源管理、事件处理和文件系统接口。
  • “跨平台”不是自动成立的,它依赖统一 API、模块声明和平台适配层。
  • 对复习来说,Qt 不应只记“能做界面”,而要记“它如何统一窗口、事件、资源和构建”。

二、项目创建后最值得先看什么

  • 入口文件 main.cpp
  • 顶层窗口类
  • 项目文件:.proCMakeLists.txt
  • 资源文件:.qrc

最小程序主线

  • 构造 QApplication
  • 创建窗口对象
  • 调用 show()
  • 进入 a.exec()

这里的关键不是代码行数少,而是 QApplication 持有主事件循环。没有它,界面对象就只是普通 C++ 对象,不会进入交互状态。

三、.pro 文件在做什么

  • 声明 Qt 模块,例如 coreguiwidgets
  • 指定目标名 TARGET
  • 指定模板 TEMPLATE
  • 注册源文件、头文件、表单文件和资源文件
  • 补充编译配置,例如 CONFIG += c++11

复习抓手

  • QT += widgets:当前项目需要窗口控件支持
  • SOURCES/HEADERS/FORMS/RESOURCES:把工程内容显式交给构建系统
  • greaterThan(QT_MAJOR_VERSION, 4):体现 Qt4/Qt5 兼容思路

四、资源系统的意义

  • 资源文件通过 :/ 路径访问图片、图标、动画等静态资源。
  • 这样做的好处是部署简单,路径稳定,代码中不必依赖外部绝对路径。
  • 对界面程序来说,图标、菜单、工具栏按钮往往都依赖资源系统。

五、从 qmake 到 CMake 应该怎样理解

  • 不要把迁移理解成“旧语法改新语法”。
  • 真正需要映射的是:
    • 模块依赖
    • 目标类型
    • 源文件集合
    • 资源文件
    • 自动生成机制,例如 AUTOMOCAUTOUICAUTORCC

迁移时最容易漏的点

  • 忘记声明 Widgets 等模块
  • 漏掉 qrc 资源
  • 忽略 mocuic 自动处理
  • 只迁移构建文件,不检查目录结构和输出目标

六、易错点

  • exec() 理解成普通函数调用,而不是事件循环入口。
  • 只知道 .pro 是工程文件,不知道它决定了模块和源文件是否被真正编译。
  • 直接在代码里写外部图片路径,而不使用资源系统。
  • 迁移到 CMake 时只追求“能编过”,忽略项目结构是否清晰。

七、复习提问

  • QApplication 为什么是 GUI 程序的入口核心?
  • .proCMakeLists.txt 的共同职责是什么?
  • 为什么 qrc 资源系统对 GUI 项目比普通命令行程序更重要?

来源

  • [[raw/Joplin/编程学习项目/使用Qt和C++构造UI界面/1. Qt概述.md]]
  • [[raw/Joplin/编程学习项目/使用Qt和C++构造UI界面/2. 创建Qt项目.md]]
  • [[raw/Joplin/编程学习项目/使用Qt和C++构造UI界面/3. 第一个Qt小程序.md]]
  • [[raw/Joplin/编程学习项目/使用Qt和C++构造UI界面/附录1 从 QMake 迁移到 CMake 详细记录.md]]
  • [[raw/Joplin/编程学习项目/使用Qt和C++构造UI界面/附录2 CMake 模板.md]]

相关页面

  • [[Qt]]
  • [[QMake与CMake迁移]]
  • [[Qt对象树]]