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(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适合复杂的主界面。
| 特性 | 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 工具链。
相关文章:
QT创建项目(项目模板、构建系统、选择类、构建套件)
1. 项目模版 项目类型界面技术适用场景核心依赖模块开发语言Qt Widget ApplicationC Widgets传统桌面应用(复杂控件)Qt WidgetsCQt Console Application无 GUI命令行工具、服务Qt CoreCQt Quick ApplicationQML/Quick现代跨平台应用(动画/触…...
力扣热题 100:动态规划专题经典题解析
系列文章目录 力扣热题 100:哈希专题三道题详细解析(JAVA) 力扣热题 100:双指针专题四道题详细解析(JAVA) 力扣热题 100:滑动窗口专题两道题详细解析(JAVA) 力扣热题 100:子串专题三道题详细解析(JAVA) 力…...
变量赋值汇编
一、核心概念 寄存器:CPU内部的高速存储单元(如EAX、EBX、x86中的RAX、ARM中的R0等) 内存地址:变量存储在内存中的位置(如 0x1000) 指令:操作寄存器和内存的命令(如 MOV, STR, LDR…...
页面白屏出现的原因
🤖 作者简介:水煮白菜王,一位前端劝退师 👻 👀 文章专栏: 前端专栏 ,记录一下平时在博客写作中,总结出的一些开发技巧和知识归纳总结✍。 感谢支持💕💕&#…...
【大模型统一集成项目】让 AI 聊天更丝滑:WebSocket 实现流式对话!
🌟 在这系列文章中,我们将一起探索如何搭建一个支持大模型集成项目 NexLM 的开发过程,从 架构设计 到 代码实战,逐步搭建一个支持 多种大模型(GPT-4、DeepSeek 等) 的 一站式大模型集成与管理平台ÿ…...
boarding_passes(登机牌)表的作用
boarding_passes(登机牌)表的作用 boarding_passes 这张表的主要作用是记录旅客的登机信息,包括: 票号 (ticket_no) - 关联到 tickets 表,表示这张票属于哪个旅客。航班 ID (flight_id) - 关联到 flights 表…...
【2025】Electron Git Desktop 实战一(上)(架构及首页设计开发)
源代码仓库: Github仓库【electron_git】 Commit : bb40040 Github Desktop 页面分析 本节目标: 1、实现类似Github Desktop的「空仓库」提示页 2、添加本地仓库逻辑编写从 Github Desktop 我们看到 他的 主要页面分为三个区域 Head头部区域…...
14 | fastgo 三层架构设计
提示: 所有体系课见专栏:Go 项目开发极速入门实战课; 在实现业务代码之前,还需要先设计一个合理的软件架构。一个好的软件架构不仅可以大大提高项目的迭代速度,还可以降低项目的阅读和维护难度。目前,行业中…...
【机器学习-基础知识】统计和贝叶斯推断
1. 概率论基本概念回顾 1. 概率分布 定义: 概率分布(Probability Distribution)指的是随机变量所有可能取值及其对应概率的集合。它描述了一个随机变量可能取的所有值以及每个值被取到的概率。 对于离散型随机变量,使用概率质量函数来描述。对于连续型随机变量,使用概率…...
面向对象Demo01
面向对象 什么是面向对象 回顾方法的定义 package oop; import java.io.IOException; public class Demo01 {public static void main(String[] args) {}//public String sayHello() {return "hello, world!";}public void sayHi() {return;}public int max(i…...
C++设计模式-抽象工厂模式:从原理、适用场景、使用方法,常见问题和解决方案深度解析
一、模式基本概念 1.1 定义与核心思想 抽象工厂模式(Abstract Factory Pattern)是创建型设计模式的集大成者,它通过提供统一的接口来创建多个相互关联或依赖的对象族,而无需指定具体类。其核心思想体现在两个维度: …...
solana区块链地址生成
solana官网地址:https://solana.com 先引入相关依赖solana/web3.js;bip39;ethereumjs/wallet 生成助记词 const mnemonic bip39.generateMnemonic(); 生成种子 const seed bip39.mnemonicToSeedSync(mnemonic); 生成密钥对 const root hdkey.EthereumHDKey.from…...
基于python的升级队列加速决策
a-f大等级是3级 a-c建筑每升1级分别需要8天 d-f建筑每升1级分别需要10天 目前以下建筑队列正在从0级升至1级 建筑A升级需要7天05:16:20 建筑b升级需要06:06:54 建筑c升级需要00:37:00 建筑d升级需要…...
Ragflow技术栈分析及二次开发指南
Ragflow是目前团队化部署大模型+RAG的优质方案,不过其仍不适合直接部署使用,本文将从实际使用的角度,对其进行二次开发。 1. Ragflow 存在问题 Ragflow 开源仓库地址:https://github.com/infiniflow/ragflow Ragflow 当前版本: v0.17.0 Ragflow 目前主要存在以下问题: …...
vue上传文件的请求头携带token校验、和携带另外的参数请求
拿element plus UI库举例,(不使用element plus的话js方法通用): <template><el-upload class"upload-demo":http-request"myUploadHttp" action"https://run.mocky.io/v3/9d059bf9-4660-45f2-…...
MySQL的 where 1=1会不会影响性能?
在MySQL中,WHERE 11 是一种常见的SQL编写技巧,通常用于动态生成SQL语句时简化条件拼接。虽然它看起来多余,但在实际使用中,WHERE 11 对性能的影响可以忽略不计。以下是详细分析: 1. WHERE 11 的作用 WHERE 11 是一个恒…...
MyBatis 中SQL 映射文件是如何与 Mapper 接口关联起来的? MyBatis 如何知道应该调用哪个 SQL 语句?
1. 命名空间 (Namespace): SQL 映射文件 (XML): 在 SQL 映射文件的 <mapper> 根元素中,有一个 namespace 属性。这个 namespace 属性的值必须是 Mapper 接口的全限定名(包名 接口名)。 <mapper namespace"com.example.mapper.…...
SICK Ranger3源码分析——断线重连
前言 本文可在https://paw5zx.github.io/SICK-Ranger3-source-code-analysis-01/中阅读,体验更佳 简单分析一下SICK Ranger3源码中断线重连的实现,这一块算是比较容易的,先择出来分析一下。 代码示例仅贴出关键部分以便分析 使用SDK版本为…...
1.7 双指针专题:三数之和(medium)
1.题目链接 15. 三数之和 - 力扣(LeetCode)https://leetcode.cn/problems/3sum/submissions/609626561/ 2.题目描述 给你⼀个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满⾜ i ! j、i ! k 且 j ! k ,同时…...
【JavaEE】Spring Boot配置文件
目录 一、Spring Boot配置文件简介二、properties 配置⽂件说明2.1 properties 基本语法2.2 value("${}")读取配置⽂件 三、yml 配置文件说明3.1 yml 基本格式3.2 yml 配置数据类型 及 读取3.3 yml配置对象及读取ConfigurationProperties(prefix "")3.4 配…...
行为模式---策略模式
概念 策略模式是一种行为设计摸是,它的核心思想是将一些列的算法封装成独立的对象,并使它们可以相互替换,通过上下文进行调用。 策略模式通过算法抽象为独立的策略类,客户端可以根据自身需求选择不同的策略类来完成任务、这种方…...
Word 小黑第15套
对应大猫16 修改样式集 导航 -查找 第一章标题不显示 再选中文字 点击标题一 修改标题格式 格式 -段落 -换行和分页 勾选与下段同页 添加脚注 (脚注默认位于底部 )在脚注插入文档属性: -插入 -文档部件 -域 类别选择文档信息,域…...
OSPF:虚链路
一、虚链路概念 在OSPF中,虚链路(Virtual Link) 是一种逻辑连接,用于解决因网络设计或扩展导致的区域无法直接连接到骨干区域(Area 0)的问题。它是通过中间区域(Transit Area)在两个…...
Ubuntu 22.04 安装配置 FTP服务器 教程
今天搞定在 Ubuntu 22.04 系统上安装和配置 VSFTPD ,还会涉及防火墙设置、SSL/TLS 设置,以及创建专门登录 FTP 服务器的账户。开始! 一、安装 VSFTPD 首先,咱得让系统知道有啥新软件包可以安装。打开终端,输入下面这…...
基于 Selenium 的软件测试方法研究
一、引言 在软件开发的漫长征程中,软件测试宛如一座坚实的堡垒,守护着软件质量的大门。随着互联网技术的飞速发展,Web 应用程序如雨后春笋般涌现,其功能的复杂性和用户交互的多样性不断增加。在这样的背景下,传统的手动…...
网络安全事件响应--应急响应(windows)
应用系统日志 Windows主要有以下三类日志记录系统事件:应用程序日志、系统日志和安全日志。 系统和应用程序日志存储着故障排除信息,对于系统管理员更为有用。安全日志记录着事件审计信息,包括用户验证(登录、远程访问等&#x…...
DataEase:一款国产开源数据可视化分析工具
DataEase 是由飞致云开发的一款基于 Web 的数据可视化 BI 工具,支持丰富的数据源连接,能够通过拖拉拽方式快速制作图表,帮助用户快速分析业务数据并洞察其趋势,为企业的业务改进与优化提供支持。 DataEase 的优势在于:…...
RTK与RTD基础原理
(文中的部分图片是摘自其他博主的文章,由于比较久,忘记原本链接了,侵删) GPS定位原理 卫星自身有自己的星历与原子钟,因此卫星知道自身准确的空间坐标与时间。因为每个卫星都有原子钟,因此每颗卫星的时间基本上都是相…...
关于MCP SSE 服务器的工作原理
模型上下文协议(Model Context Protocol,简称MCP) 是一种全新的开放协议,专门用于标准化地为大语言模型(LLMs)提供应用场景和数据背景。 你可以把MCP想象成AI领域的“USB-C接口”,它能让不同的A…...
碳中和小程序:助力用户记录低碳行为,推动环保生活
碳中和小程序:助力用户记录低碳行为,推动环保生活 一、碳中和的全民化挑战与数字化机遇 中国承诺2030年前实现碳达峰,2060年前达成碳中和目标。在这一国家战略下,个人碳减排贡献率需从当前不足5%提升至25%。小程序开发技术正成为破解"公众参与度低"“行为量化难…...
