当前位置: 首页 > news >正文

Qt 项目架构设计

在开发一个 Qt 项目时,合理的文件夹结构和清晰的构建流程是非常重要的。Qt 项目通常需要管理源代码、UI 文件、资源文件、构建脚本等。下面我会给出一个详细的文件夹结构示例,并解释每个部分的作用及如何设计 Makefile 或使用 Qt 的 qmake 来自动化构建过程。

  1. Qt 项目的文件夹结构
    以下是一个常见的 Qt 项目文件夹结构示例:

makefile

MyQtProject/
│
├── src/                  # 源代码
│   ├── main.cpp          # 程序入口
│   ├── mainwindow.cpp    # 主窗口实现
│   ├── mainwindow.ui     # 主窗口的 UI 描述文件
│   ├── customwidget.cpp  # 自定义控件的实现
│   └── customwidget.h    # 自定义控件的头文件
│
├── resources/            # 资源文件
│   ├── icons/            # 图标和图片
│   │   ├── appicon.png
│   │   └── button_icon.png
│   └── qml/              # QML 文件(如果使用 QML)
│       └── main.qml
│
├── include/              # 公共头文件
│   └── customwidget.h    # 公共组件的头文件
│
├── build/                # 构建文件(由 qmake 或 cmake 生成)
│   └── Makefile          # makefile 文件或 cmake 构建文件
│
├── ui/                   # UI 文件
│   └── mainwindow.ui     # 用 Qt Designer 生成的 UI 文件
│
├── .pro                  # qmake 项目文件
└── README.md             # 项目说明文档
  1. 文件夹结构解释
    src/: 存放所有源代码文件,包括 .cpp 和 .h 文件。
    resources/: 存放项目中的资源文件,如图片、图标、QML 文件等。
    include/: 存放公共头文件,通常放置项目中共享的接口或类。
    build/: 存放由 qmake 或 cmake 生成的构建文件夹,包含编译后的临时文件和最终可执行文件。
    ui/: 存放由 Qt Designer 生成的 UI 文件(.ui 格式),这些文件将会在编译过程中被 uic 工具转换为 C++ 代码。
    .pro: Qt 项目的配置文件,qmake 使用此文件来管理编译设置、依赖项等。
    README.md: 项目说明文档,包含项目的功能、使用说明等。
  2. 设计 Qt 项目的 Makefile 或 qmake 配置
    使用 qmake 配置文件 (.pro)
    qmake 是 Qt 自带的构建工具,通常用 .pro 文件来描述项目的结构、源文件、依赖等。
pro
# MyQtProject.proQT       += core gui  # 指定项目使用的 Qt 模块CONFIG   += c++11     # 使用 C++11 标准# 项目名称
TARGET = MyQtProject# 源代码文件
SOURCES += src/main.cpp \src/mainwindow.cpp \src/customwidget.cpp# 头文件
HEADERS += src/mainwindow.h \src/customwidget.h# UI 文件
FORMS += ui/mainwindow.ui# 资源文件
RESOURCES += resources.qrc  # 用于管理资源文件(例如图片、图标等)# QML 文件(如果有的话)
QML_IMPORT_PATH += resources/qml

qmake 构建流程
qmake: 运行 qmake 命令来生成 Makefile。qmake 会读取 .pro 文件,根据项目配置生成相应的 Makefile。
make: 运行 make 来编译项目。make 根据 Makefile 中的规则进行编译和链接。
执行: 编译完成后,生成的可执行文件会放在指定的输出目录(通常是 build/ 文件夹)中。
4. 构建过程示例
假设你的项目结构已经如上所示,并且 .pro 文件配置正确,接下来就是如何构建项目:

生成 Makefile

在项目根目录下,运行以下命令生成 Makefile:

qmake MyQtProject.pro
这会读取 .pro 文件并生成适合当前系统环境的 Makefile。

编译项目

运行 make 命令进行编译:

make
make 会根据 Makefile 进行源代码的编译和链接,最终生成可执行文件。

运行项目

编译完成后,可以运行生成的可执行文件:

./MyQtProject
5. Qt 项目中常用的命令和工具
qmake: Qt 的构建工具,用于根据 .pro 文件生成 Makefile。
make: 编译工具,根据 Makefile 进行编译。
uic: 用于将 .ui 文件转换为 C++ 代码。
moc: Qt 的元对象编译器,用于处理 Qt 的信号槽机制(通常由 qmake 自动调用)。
rcc: 资源编译器,用于处理 .qrc 资源文件。
6. 注意事项和最佳实践
分离逻辑和 UI: 将 UI 文件和业务逻辑分开管理,UI 文件由 Qt Designer 生成,可以通过 uic 工具转换为 C++ 代码。尽量让 mainwindow.ui 只包含界面元素,不涉及业务逻辑。
模块化代码结构: 将不同的功能模块分开管理,例如将自定义控件、工具类、算法等拆分为不同的 .cpp 和 .h 文件,避免单个文件过长。
使用 QML 时的组织方式: 如果项目中涉及 QML,可以将 QML 文件放入 resources/qml/ 文件夹,并通过 QML_IMPORT_PATH 配置来指定路径。
资源文件: 使用 resources.qrc 文件来管理项目中的图片、图标等静态资源,qmake 会将 .qrc 文件自动编译到项目中。

总结
Qt 项目的设计要注重清晰的结构和可维护性,合理分配各个模块和资源文件的位置。通过使用 qmake 和 Makefile,可以实现自动化的构建流程,使得项目更易于管理和部署。在项目开发过程中,遵循良好的代码组织原则、合理的模块划分和适当的工具使用,能够提升项目的可扩展性和维护性。

相关文章:

Qt 项目架构设计

在开发一个 Qt 项目时,合理的文件夹结构和清晰的构建流程是非常重要的。Qt 项目通常需要管理源代码、UI 文件、资源文件、构建脚本等。下面我会给出一个详细的文件夹结构示例,并解释每个部分的作用及如何设计 Makefile 或使用 Qt 的 qmake 来自动化构建过…...

Elasticsearch:管理和排除 Elasticsearch 内存故障

作者:来自 Elastic Stef Nestor 随着 Elastic Cloud 提供可观察性、安全性和搜索等解决方案,我们将使用 Elastic Cloud 的用户范围从完整的运营团队扩大到包括数据工程师、安全团队和顾问。作为 Elastic 支持代表,我很乐意与各种各样的用户和…...

高级java每日一道面试题-2024年11月07日-Redis篇-Redis有哪些功能?

如果有遗漏,评论区告诉我进行补充 面试官: Redis有哪些功能? 我回答: Redis 是一个开源的、基于键值对的 NoSQL 数据库,以其高性能、丰富的数据结构和多种功能而闻名。在高级 Java 面试中,了解 Redis 的核心功能和高级特性是非常重要的。以下是 Redi…...

实用且免费的 IP 地域查询 API 接口推荐

实用且免费的 IP 地域查询 API 接口推荐 在日常开发中,IP 地域查询是一个常见需求。最近无意间发现一个实用的 IP 地域查询 API,目前是免费的,未来是否收费尚不可知,但在当前情况下非常值得推荐。 API 地址示例: ht…...

STM32学习笔记----SPI协议

STM32的SPI(串行外设接口,Serial Peripheral Interface)是一种常见的同步串行通信协议,广泛应用于与传感器、显示屏、存储设备等外设的通信。SPI通过主从模式(Master/Slave)来实现数据交换,其中…...

Ceph的pool有两种类型

Replicated Pool(拷贝型Pool,默认) 概述: 这是Ceph的默认存储池类型。它通过生成对象的多份拷贝来确保数据的冗余和高可用性。 工作原理: 每个存入的对象(Object)都会被存储为多个副本&#xf…...

推荐一款流程图和图表绘制工具:WizFlow Flowcharter Pro

WizFlow Flowcharter是一款易于使用、功能丰富的Windows流程图和图表绘制工具。它允许用户使用超过一百种预定义的形状和箭头定义形状“样式”。您可以将自己的样式保存在图表模板中,以建立自己的绘图方法。WizFlow附带了完整的流程图模板,以帮助您入门。…...

设计模式之插件模式

插件模式是一种设计模式,可以让您在不修改现有系统代码的情况下扩展功能,非常适合实现监控软件和交换机配置的解耦。在嵌入式Linux系统中,您可以使用C++实现插件机制,使监控软件能够动态加载交换机型号的配置模块。这种方式允许您通过插件形式快速适配新型号的交换机。 插…...

深度学习基础—Beam search集束搜索

引言 深度学习基础—Seq2Seq模型https://blog.csdn.net/sniper_fandc/article/details/143781223?fromshareblogdetail&sharetypeblogdetail&sharerId143781223&sharereferPC&sharesourcesniper_fandc&sharefromfrom_link 上篇博客讲到,贪心算…...

STM32 串口输出调试信息

软硬件信息 CubeMX version 6.12.1Keil uVision V5.41.0.0 注意 串口有多种: TTL232485 串口的相关知识: 01-【HAL库】STM32实现串口打印(printf方式) , 内含 TTL 和 232 区别。 我把 232 串口连进 STM32 串口助手收到的信息…...

任务调度中心-XXL-JOB使用详解

目录 详解 调度中心 执行器 原理 快速入门 源码仓库地址 1.初始化数据库 2.配置调度中心 1.解压源码 2.需改配置文件 3.启动调度中心 3.配置执行器 1.引入pom依赖 2.修改配置文件 3.执行器组件配置 4.部署执行器项目 4.开发第一个任务 BEAN模式(类…...

git本地分支推送到远程和远程pull到本地

文章目录 本地分支推送到远程仓库git拉取远程分支到本地 本地分支推送到远程仓库 要将本地分支推送到远程仓库的某个分支(可以是同名的分支,也可以是不同名的分支),你可以使用 git push 命令。这里有几种不同的情况: …...

Python_爬虫1_Requests库入门

目录 Requests库 7个主要方法 Requests库的get()方法 Response对象的属性 爬取网页的通用代码框架 理解requests库的异常 HTTP协议及Requests库方法 HTTP协议 HTTP协议采用URL作为定位网络资源的标识。 HTTP协议对资源的操作 理解PATCH和PUT的区别 HTTP协议与Requse…...

安全见闻1-5

涵盖了编程语言、软件程序类型、操作系统、网络通讯、硬件设备、web前后端、脚本语言、病毒种类、服务器程序、人工智能等基本知识,有助于全面了解计算机科学和网络技术的各个方面。 安全见闻1 1.编程语言简要概述 C语言:面向过程,适用于系统…...

STM32 学习笔记-----STM32 的启动过程

STM32 的启动过程是一个精细而系统的流程,它涉及从芯片复位开始,到初始化系统、设置时钟、运行主程序等一系列步骤。下面详细介绍 STM32 启动过程的主要步骤。 1. Boot引脚设定 STM32 系列芯片有多个启动模式,这些模式是通过引脚&#xff0…...

35.3K+ Star!PhotoPrism:一款基于AI的开源照片管理工具

PhotoPrism 简介 PhotoPrism[1] 是一个为去中心化网络设计的AI照片应用,它利用最新技术自动标记和查找图片,实现自动图像分类与本地化部署,你可以在家中、私有服务器或云端运行它。 项目特点 主要特点 浏览所有照片和视频,无需担心RAW转换、重复项或视频格式。 使用强大的…...

网络安全:数字时代的守护盾

在21世纪的今天,互联网已经渗透到我们生活的方方面面,从社交互动、在线购物、远程办公到智能家居,无一不彰显着数字技术的便捷与高效。然而,随着网络空间的日益扩大,网络安全问题也日益凸显,成为了一个不容…...

vue 中监听页面尺寸变化就调用函数

方法一:使用 window.onresize 结合 Vue 实例的生命周期钩子(不推荐,存在覆盖风险) 虽然可以直接使用原生的 window.onresize 事件来监听窗口大小变化,但这种方式在 Vue 项目中有一些局限性,因为如果在多个…...

全面解读 USB Key:定义、使用场景、加密技术及 Java 实现

文章目录 **什么是 USB Key?****USB Key 的使用场景**1. **身份认证**2. **数字签名**3. **数据加密与解密**4. **证书管理** **USB Key 解决的问题****USB Key 使用的加密技术**1. **对称加密**2. **非对称加密**3. **哈希算法**4. **数字签名**5. **PKI&#xff0…...

❤React-React 组件基础(类组件)

❤React-React 组件基础 1、组件化开发介绍 组件化开发思想:分而治之 React的组件按照不同的方式可以分成类组件: 划分方式一(按照组件的定义方式) 函数组件(Functional Component )和类组件(Class Component); …...

SCAU期末笔记 - 数据分析与数据挖掘题库解析

这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...

在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module

1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...

转转集团旗下首家二手多品类循环仓店“超级转转”开业

6月9日,国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解,“超级…...

Cinnamon修改面板小工具图标

Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级

在互联网的快速发展中,高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司,近期做出了一个重大技术决策:弃用长期使用的 Nginx,转而采用其内部开发…...

OPENCV形态学基础之二腐蚀

一.腐蚀的原理 (图1) 数学表达式:dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一,腐蚀跟膨胀属于反向操作,膨胀是把图像图像变大,而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...

人机融合智能 | “人智交互”跨学科新领域

本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...

【C++特殊工具与技术】优化内存分配(一):C++中的内存分配

目录 一、C 内存的基本概念​ 1.1 内存的物理与逻辑结构​ 1.2 C 程序的内存区域划分​ 二、栈内存分配​ 2.1 栈内存的特点​ 2.2 栈内存分配示例​ 三、堆内存分配​ 3.1 new和delete操作符​ 4.2 内存泄漏与悬空指针问题​ 4.3 new和delete的重载​ 四、智能指针…...

在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)

考察一般的三次多项式,以r为参数: p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]; 此多项式的根为: 尽管看起来这个多项式是特殊的,其实一般的三次多项式都是可以通过线性变换化为这个形式…...

Python Einops库:深度学习中的张量操作革命

Einops(爱因斯坦操作库)就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库,用类似自然语言的表达式替代了晦涩的API调用,彻底改变了深度学习工程…...