QtCreator通过CMake多文件编译.cpp、.qss、.h、.ui文件,达到MVC三层架构的效果

        博主在构建C++项目的时候,一般都喜欢将头文件和源文件分开为不同的文件夹,比如include目录下只存放.h文件和.ui文件,src目录下只存放.cpp和.qss文件,res目录下只存放图片、音频等文件,这时候使用CMake对项目进行分文件管理就特别方便和清晰了。

    很多人写qt项目的时候,就是一大堆文件全部杂糅在一个文件目录下面,非常杂乱,不易于管理。

        我们对项目进行分文件管理,整个项目结构就会清晰许多,比如下图所示。

        那么问题来了,这么复杂的分包管理,Cmake要怎么写呢,根目录下的cmake文件如下:

看起来目录复杂,实际上Cmake却无比简单。

cmake_minimum_required(VERSION 3.5) # CMake install : https://cmake.org/download/
project(qttest3 LANGUAGES CXX)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_PREFIX_PATH "d:/c.app/QT6/6.6.2/mingw_64") # Qt Kit Dir
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
find_package(Qt6 COMPONENTS Widgets REQUIRED) # Qt COMPONENTS
aux_source_directory(./src srcs)
aux_source_directory(./src/view views)
file(GLOB includes "include/view/*.h")
add_executable(${PROJECT_NAME}${includes}${srcs}${views}res.qrc
)
target_link_libraries(${PROJECT_NAME} PRIVATE Qt6::Widgets) # Qt5 Shared Library

include目录下的view目录下的qttest3.h

//这个ui_qttest3.h文件的位置就是qttest3.ui文件的位置
#include "ui_qttest3.h"
#include <QMainWindow>class qttest3 : public QMainWindow {Q_OBJECTpublic:qttest3(QWidget* parent = nullptr);~qttest3();private:Ui_qttest3* ui;
};

qttest3.ui

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0"><class>qttest3</class><widget class="QMainWindow" name="qttest3"><property name="geometry"><rect><x>0</x><y>0</y><width>800</width><height>600</height></rect></property><property name="windowTitle"><string>qttest3</string></property><widget class="QWidget" name="centralwidget"><widget class="QListView" name="listView"><property name="geometry"><rect><x>220</x><y>120</y><width>256</width><height>192</height></rect></property></widget><widget class="QPushButton" name="pushButton"><property name="geometry"><rect><x>250</x><y>360</y><width>75</width><height>24</height></rect></property><property name="text"><string>hello</string></property></widget><widget class="QCheckBox" name="checkBox"><property name="geometry"><rect><x>370</x><y>360</y><width>79</width><height>20</height></rect></property><property name="text"><string>CheckBox</string></property></widget></widget><widget class="QMenuBar" name="menubar"><property name="geometry"><rect><x>0</x><y>0</y><width>800</width><height>17</height></rect></property></widget><widget class="QStatusBar" name="statusbar"/></widget><resources/><connections/>
</ui>

src目录下的main.cpp

#include "../include/view/qttest3.h"
#include <QApplication>
#include <QFile>
int main(int argc, char *argv[])
{QApplication a(argc, argv);QFile styleFile(":/src/view/qt.qss"); // 从资源文件中加载QSS文件styleFile.open(QFile::ReadOnly);QString styleSheet = QLatin1String(styleFile.readAll());qApp->setStyleSheet(styleSheet);qttest3 w;w.show();return a.exec();
}

对应src目录下的view目录下的qt.qss

/* 设置窗口背景颜色 */
QWidget {background-color: hsl(116, 92%, 48%);
}/* 设置按钮样式 */
QPushButton {background-color: lightblue;border: 2px solid darkblue;border-radius: 5px;padding: 5px 10px;color: darkblue;
}/* 鼠标悬停时按钮样式 */
QPushButton:hover {background-color: #00d0ff;color: white;
}/* 鼠标按下时按钮样式 */
QPushButton:pressed {background-color: #8b0076;
}

将qt.qss加入到资源文件中,这里的路径才是main.cpp里面引用qss文件的路径。

对应src目录下的qttest3.cpp

#include "../../include/view/qttest3.h"qttest3::qttest3(QWidget* parent): QMainWindow(parent), ui(new Ui_qttest3)
{ui->setupUi(this);
}qttest3::~qttest3()
{delete ui; 
}

运行程序,这个项目目录是不是清晰很多了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/883418.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

qml圆形图片,qml圆形头像制作

代码比较简单&#xff0c;就不细讲了&#xff0c;大家直接看下面源码吧&#xff01;如果对你有所帮助&#xff0c;可以帮角角点个关注嘛&#xff1f; import QtQuick import QtQuick.Effects import Qt5Compat.GraphicalEffectsWindow {width: 640height: 480visible: truetit…

使用代理服务器后sse数据合并问题

如果是使用本地代理服务器devServer compress:false,如果是发布到生产环境下的代理服务器nginx 增加如下配置&#xff0c;该配置同时支持websocket和sse proxy_http_version 1.1; #设置代理请求使用 HTTP/1.1 版本。WebSocket 需要 HTTP/1.1&#xff0c;因为它支持持久连接和更…

【python库】PandasGUI介绍

Github地址&#xff1a;https://github.com/adamerose/PandasGUI 在数据科学和分析过程中&#xff0c;数据的可视化和交互操作是非常重要的环节。尽管 Pandas 是一个强大的数据处理库&#xff0c;但其缺乏用户友好的图形界面&#xff0c;这使得数据探索和分析变得相对繁琐。pan…

【每日一题】LeetCode - 盛最多水的容器

给定一个长度为 n 的整数数组 height。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i])。要求找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。 输入示例&#xff1a; height [1,8,6,2,5,4,8,3,7]输出&#xff1a; 4…

2024年1024程序人生总结

2024-1024 0.大环境0.1.经济0.2.战争 1.我的程序人生1.1.游戏 2.节日祝福 0.大环境 今年的1024最大的感触就是没有节日氛围&#xff0c;往年公司还会准备节日礼物&#xff0c;今年没有&#xff0c;由此可见大环境有多么糟糕。 除此之外&#xff0c;就是到公司应聘的程序员越来…

如何理解前端与后端开发

前端与后端开发是构建现代Web应用的两个主要部分&#xff0c;它们共同工作&#xff0c;为用户提供完整的在线体验。以下是对前端和后端开发的理解和它们之间的主要区别&#xff1a; 前端开发&#xff08;客户端开发&#xff09; 用户界面&#xff08;UI&#xff09;&#xff…

2025前端面试-浏览器的事件循环和浏览器的事件循环的区别是什么---002

浏览器的事件循环和浏览器的事件循环的区别是什么 JS是单线程的浏览器中JS执行和DOM渲染公用一个线程异步 异步中又有宏任务和微任务 宏任务 setTimtout setInterval微任务 Promise async await(先执行同步任务后执行异步任务&#xff09;微任务在下一轮DOM渲染之前执行&…

Python快速入门教程

目录 1. Python 简介 2. 环境准备 3. 第一个 Python 程序 4. 变量与数据类型 5. 基本操作与控制结构 6. 函数与模块 7. 实践项目 结语 Python 是一种非常友好的编程语言&#xff0c;特别适合初学者。它的语法简洁&#xff0c;容易上手&#xff0c;并且广泛应用于各种领…

C++结合图形编程与物联网:你更偏向哪种方式来学习信息学奥赛?

随着信息学奥赛在全国范围内的热度逐年攀升&#xff0c;学生和家长们越来越重视如何有效备赛。传统的编程学习方式侧重于算法和数据结构&#xff0c;但随着科技的发展&#xff0c;图形化编程与物联网&#xff08;IoT&#xff09;项目逐渐成为新兴的学习路径。通过C结合图形化编…

Rust 力扣 - 1. 两数相加

文章目录 题目描述题解思路题解代码题目链接 题目描述 题解思路 我们使用一个全局的备忘录&#xff0c;然后我们遍历数组&#xff0c;如果当前元素在备忘录里面找到了&#xff0c;就返回备忘录里面记录的下标和当前下标记录&#xff0c;没找到就把当前元素匹配的元素和当前元素…

N.Katz对数学的贡献我一无所知

当年我在Columbia大学数学系&#xff0c;每次数论seminar我都听&#xff0c;这个系列seminar是由Goldfeld跟Szpiro主持的&#xff0c;那次本来Katz是应邀来做报告的&#xff0c;但他却对Goldfeld出言不逊&#xff08;也对广大听众&#xff09;&#xff0c;言语中带着训斥&#…

人工智能_神经网络103_感知机_感知机工作原理_感知机具备学习能力_在学习过程中自我调整权重_优化效果_多元线性回归_逻辑回归---人工智能工作笔记0228

由于之前一直对神经网络不是特别清楚,尤其是对神经网络中的一些具体的概念,包括循环,神经网络卷积神经网络以及他们具体的作用,都是应用于什么方向不是特别清楚,所以现在我们来做教程来具体明确一下。 当然在机器学习之后还有深度学习,然后在深度学习中对各种神经网络的…

Java对称加密:AES 高级加密标准

1、对称加密简述 对称加密&#xff0c;又称对称密钥加密或私钥加密&#xff0c;是一种在加密和解密过程中使用相同一个密钥的加密算法。这种加密方式的核心在于&#xff0c;发送方使用某个密钥对数据进行加密&#xff0c;接收方则使用完全相同的密钥对数据进行解密。由于加密和…

Kotlin-协程基础

coroutines并不在kotlin的标准库中&#xff0c;但kotlin提供了协程支持 使用协程&#xff0c;先引入协程包 implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.9.0") 先来一个简单的协程例子&#xff1a; fun main() {runBlocking {launch {dela…

基于物联网的智慧考场系统设计(论文+源码)

1. 功能设计 &#xff08;1&#xff09;温度监测与控制功能&#xff1a; 系统需要能够实时采集考场内的温度信息&#xff0c;通过DS18B20传感器获取准确的数据&#xff0c;并在OLED屏幕和APP上显示。当温度异常过高时&#xff0c;系统应自动启动继电器&#xff0c;模拟空调开启…

数字IC后端实现 | Innovus各个阶段常用命令汇总

应各位读者要求&#xff0c;小编最近按照Innovus流程顺序整理出数字IC后端项目中常用的命令汇总。限于篇幅&#xff0c;这次只更新到powerplan阶段。有了这份Innovus常用命令汇总&#xff0c;学习数字IC后端从此不再迷路&#xff01;如果大家觉得这个专题还不错&#xff0c;想继…

C语言_动态内存管理

本章重点 为什么存在动态内存分配 动态内存函数的介绍 malloc free calloc realloc 常见的动态内存错误 几个经典的笔试题 柔性数组 1. 为什么存在动态内存分配 我们已经掌握的内存开辟方式有&#xff1a; int val 20;//在栈空间上开辟四个字节 char arr[10] {0}…

Maven进阶——坐标、依赖、仓库

目录 1.pomxml文件 2. 坐标 2.1 坐标的概念 2.2 坐标的意义 2.3 坐标的含义 2.4 自己项目的坐标 2.5 第三方项目坐标 3. 依赖 3.1 依赖的意义 3.2 依赖的使用 3.3 第三方依赖的查找方法 3.4 依赖范围 3.5 依赖传递和可选依赖 3.5.1 依赖传递 3.5.2 依赖范围对传…

算法的学习笔记—数组中的逆序对(牛客JZ51)

&#x1f600;前言 在算法和数据结构领域&#xff0c;"逆序对"是一个经典问题。它在数组中两个数字之间定义&#xff0c;若前面的数字大于后面的数字&#xff0c;则这两个数字组成一个逆序对。我们要做的就是&#xff0c;给定一个数组&#xff0c;找出数组中所有的逆…

Docker 镜像下载问题及解决办法

Docker 镜像下载问题及解决办法 我在杂乱的、破旧的村庄寂寞地走过漫长的雨季&#xff0c;将我年少的眼光从晦暗的日子里打捞出来的是一棵棵开花的树&#xff0c;它们以一串串卓然不俗的花擦明了我的眼睛&#xff0c;也洗净了我的灵魂。 引言 在使用 Docker 时&#xff0c;用户…