QT创建项目(项目模板、构建系统、选择类、构建套件)

embedded/2025/3/15 5:16:52/

1. 项目模版

项目类型界面技术适用场景核心依赖模块开发语言
Qt Widget ApplicationC++ Widgets传统桌面应用(复杂控件)Qt WidgetsC++
Qt Console Application无 GUI命令行工具、服务Qt CoreC++
Qt Quick ApplicationQML/Quick现代跨平台应用(动画/触摸)Qt QuickQML + C++
Qt Quick (compat)QML(旧版兼容)迁移旧版 Qt Quick 项目到 Qt 6Qt Quick + QtQuick.CompatQML + C++

2. 构建系统 

qmake是Qt自带的构建工具,专门为Qt项目设计,简化了项目的配置过程。而CMake是一个跨平台的构建系统生成器,支持更广泛的项目类型,不仅仅是Qt。

工具定位开发者主要用途
qmakeQt 官方早期构建工具,专为 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(MyAppmain.cppmainwindow.cppmainwindow.h
)# 处理 Qt 资源文件
qt_add_resources(MyApp "resources"PREFIX "/"FILES icons.qrc
)# 链接 Qt 库
target_link_libraries(MyApp PRIVATEQt6::CoreQt6::GuiQt6::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适合复杂的主界面。

特性QWidgetQMainWindowQDialog
继承关系所有控件的基类继承自 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 工具链。

 


http://www.ppmy.cn/embedded/172676.html

相关文章

ROS实践(三)机器人描述文件xacro(urdf扩展)

目录 一、定义 二、xacro 文件常见组成部分 1. 命名空间声明 2. 定义宏 3. 调用宏 4. 定义参数 5. 条件语句 6. 转换 xacro 文件为 urdf 7. gazebo标签 三、代码示例 1. gazebo标签使用(仿真参数配置) 2. 引用仿真配置并定义机器人模型&#x…

win10安装部署DB-gpt,坑多

DB-GPT-0.7版本win11安装,最新版本,安装方式变更了-CSDN博客 已经按照最新版本了,参考上面的链接,如果需要老版本的看下面的按照 参考DB-GPT官网地址 https://www.yuque.com/eosphoros/dbgpt-docs/qno7x8hmgyulbg80 下载DB-GPT源…

暨南大学智科人工智能复试模拟

本人初试统招线以外,复试逆袭上岸!!!复试中的笔试和面试尤为重要,笔试固然重要但是面试的不确定性更强。另外,很多同学在复试之前可能都没有完整的走过一遍复试面试的流程,这里建议大家最好是能…

算法-求最长的连续函数

题目链接:128. 最长连续序列 - 力扣(LeetCode) 题目描述: 给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。 请你设计并实现时间复杂度为 O(n…

数据库第二次作业

要求: 单表查询 素材: 表名:worker-- 表中字段均为中文,比如 部门号 工资 职工号 参加工作 等 CREATE TABLE worker (部门号 int(11) NOT NULL,职工号 int(11) NOT NULL,工作时间 date NOT NULL,工资 float(8,2) NOT NULL,政治面…

语音视频App协议安全实战:防御伪造/窃听/Deepfake攻击

一、SDP协议安全加固 1. SDP字段校验(防止参数篡改) 安全SDP生成示例(Node.js): const crypto require(crypto); function signSDP(sdp) { const hmac crypto.createHmac(sha256, SECRET_KEY); hmac.update(sd…

Redis 简介

1.1 Redis是什么 (1)全称:Remote Dictionary Server(远程字典服务器)。是完全开源免费的,用C语言编写 的, 遵守BSD协议。是一个高性能的(key/value)分布式内存数据库,基于内存运行并…

【数据结构】-- LinkedList与链表(2)

文章目录 4. LinkedList的模拟实现5. LinkedList的使用5.1 什么是LinkedList5.2 LinkedList的使用5.2.1 LinkedList的构造5.2.2 LinkedList的其他常用方法介绍5.2.3 LinkedList的遍历 6. ArrayList和LinkedList的区别 4. LinkedList的模拟实现 public class MyLinkedList {sta…