QT创建项目(项目模板、构建系统、选择类、构建套件)
1. 项目模版
项目类型 | 界面技术 | 适用场景 | 核心依赖模块 | 开发语言 |
---|---|---|---|---|
Qt Widget Application | C++ Widgets | 传统桌面应用(复杂控件) | Qt Widgets | C++ |
Qt Console Application | 无 GUI | 命令行工具、服务 | Qt Core | C++ |
Qt Quick Application | QML/Quick | 现代跨平台应用(动画/触摸) | Qt Quick | QML + C++ |
Qt Quick (compat) | QML(旧版兼容) | 迁移旧版 Qt Quick 项目到 Qt 6 | Qt Quick + QtQuick.Compat | QML + C++ |
2. 构建系统
qmake是Qt自带的构建工具,专门为Qt项目设计,简化了项目的配置过程。而CMake是一个跨平台的构建系统生成器,支持更广泛的项目类型,不仅仅是Qt。
工具 | 定位 | 开发者 | 主要用途 |
---|---|---|---|
qmake | Qt 官方早期构建工具,专为 Qt 项目优化 | Qt 团队 | 生成平台相关的 Makefile 或项目文件 |
CMake | 跨平台构建系统生成器,支持多种编译器和项目类型(不限于 Qt) | Kitware | 生成平台无关的构建文件(如 Makefile、Visual Studio 项目) |
工具 | 优点 | 缺点 |
---|---|---|
qmake | - 简单易学 - 与 Qt 深度集成 - 快速配置小型项目 | - 功能有限 - 跨平台支持较弱 - 已过时 |
CMake | - 跨平台工业标准 - 强大的扩展性 - 活跃的社区支持 | - 学习曲线陡峭 - 配置复杂度较高 |
项目从 qmake 迁移到 CMake 时,除了
.pro
和CMakeLists.txt
文件的差异,项目中的 代码本身通常不需要修改,但某些与构建系统相关的代码或配置可能需要调整 。
qmake 项目文件(.pro):
# 指定 Qt 模块
QT += core gui widgets
# 项目名称
TARGET = MyApp
# 源文件
SOURCES += main.cpp \
mainwindow.cpp
# 头文件
HEADERS += mainwindow.h
# 资源文件
RESOURCES += icons.qrc
# 条件编译(平台相关)
win32 {
LIBS += -luser32
} else {
LIBS += -lpthread
}
等效的 CMakeLists.txt:
# 指定 CMake 最低版本
cmake_minimum_required(VERSION 3.16)
# 定义项目名称和语言
project(MyApp LANGUAGES CXX)
# 查找 Qt 模块
find_package(Qt6 COMPONENTS Core Gui Widgets REQUIRED)
# 添加可执行文件
add_executable(MyApp
main.cpp
mainwindow.cpp
mainwindow.h
)
# 处理 Qt 资源文件
qt_add_resources(MyApp "resources"
PREFIX "/"
FILES icons.qrc
)
# 链接 Qt 库
target_link_libraries(MyApp PRIVATE
Qt6::Core
Qt6::Gui
Qt6::Widgets
)
# 平台特定配置
if(WIN32)
target_compile_definitions(MyApp PRIVATE WINDOWS)
elseif(UNIX)
target_compile_definitions(MyApp PRIVATE LINUX)
endif()
3. 选择类
QMainWindow是主窗口类,通常用于应用程序的主界面,包含菜单栏、工具栏、状态栏等。QWidget是所有用户界面对象的基类,可以作为其他窗口或控件的容器。
QDialog是对话框类,用于短期交互,比如打开文件或设置选项。
三个类的继承关系。
QMainWindow和QDialog都是QWidget的子类,但各自有不同的扩展功能。
QMainWindow提供了标准的应用程序框架,
而QDialog则专注于对话框的特定行为,比如模态和非模态。
QWidget适合作为自定义控件或简单窗口,而QMainWindow适合复杂的主界面。
特性 | QWidget | QMainWindow | QDialog |
---|---|---|---|
继承关系 | 所有控件的基类 | 继承自 QWidget | 继承自 QWidget |
预设组件 | 无 | 菜单栏、工具栏、状态栏 | 对话框按钮布局 |
窗口修饰 | 可选标题栏 | 完整标题栏(最大化/最小化) | 简化标题栏(无最大化) |
典型用途 | 简单窗口或子控件 | 应用程序主界面 | 弹窗、配置窗口 |
模态支持 | 需手动实现 | 无内置支持 | 支持模态(exec() ) |
返回值机制 | 无 | 无 | 可返回 Accepted/Rejected |
1. 主界面开发 → QMainWindow
-
需要菜单栏、工具栏或停靠窗口的复杂应用。
2. 短期交互弹窗 → QDialog
-
如文件选择、设置选项、消息提示。
3. 自定义控件或简单窗口 → QWidget
-
作为子控件容器,或不需要复杂框架的独立窗口。
4. 构建套件
MSVC是微软的Visual C++编译器,主要用于Windows平台,和Visual Studio集成。而MinGW是Minimalist GNU for Windows的缩写,提供了GNU工具链在Windows上的移植,可以生成原生Windows应用,但使用的是GNU的工具链。
MSVC通常需要安装Visual Studio,而MinGW可能更轻量。MSVC是商业使用可能需要授权,而MinGW是开源的。
特性 | MSVC(Microsoft Visual C++) | MinGW(GNU for Windows) |
---|---|---|
开发者 | 微软(Microsoft) | GNU 社区 + MinGW 项目 |
编译器基础 | 微软的闭源编译器(集成于 Visual Studio) | GNU GCC 的 Windows 移植版(开源) |
兼容性 | 仅 Windows | 跨平台支持(通过 GCC) |
运行时库依赖 | 依赖 MSVCRT(需安装 VC++ Redistributable) | 依赖 MinGW 运行时库(静态或动态链接) |
调试工具 | 深度集成 Visual Studio 调试器 | 支持 GDB(需手动配置) |
C++ 标准支持 | 紧跟最新标准(如 C++20),更新快 | 更新较慢(依赖 GCC 版本) |
性能优化 | 针对 Windows 高度优化,生成代码效率高 | 通用优化,可能略逊于 MSVC |
授权协议 | 闭源(需 Visual Studio 授权,社区版免费) | 开源(GPL/LGPL) |
Qt 官方支持 | 优先支持,预编译包完善 | 支持,但部分模块可能需自行编译 |
部署便捷性 | 需分发 VC++ 运行时库(或静态链接) | 可静态编译,减少依赖 |
1. 推荐使用 MSVC 的情况
-
开发 Windows 专用应用:需要深度集成 Windows API(如 DirectX、COM 组件)。
-
依赖 Visual Studio 生态:使用 Visual Studio 的调试器、性能分析工具。
-
企业级开发:需要官方支持、长期维护的编译器。
-
追求性能:MSVC 生成的代码在 Windows 上通常更高效。
2. 推荐使用 MinGW 的情况
-
跨平台开发:希望代码在 Linux/macOS 和 Windows 间无缝移植(使用同一工具链)。
-
开源项目:需遵守 GPL 协议,避免闭源依赖。
-
轻量化部署:通过静态链接减少运行时依赖(无需安装 VC++ Redistributable)。
-
资源受限环境:无需安装庞大的 Visual Studio,只需 MinGW 工具链。