Qt window frame + windowTitle + windowIcon属性(3)
文章目录
- window frame属性
- window frame的概念
- 1. window frame的影响
- 2. 图片演示
- 3. 代码演示
- API接口
- widget.cpp(测试代码)
- windowTitle属性
- API接口
- 问题 + 注意点
- widget.cpp(属性用法)
- windowIcon属性
- API接口
- 啥是窗口图标
- 玩法
- 1. 先看代码 + 效果图
- 2. icon传参问题(特别注意)
- qrc机制(重点)
- 绝对路径与相对路径
- 啥是qrc机制 + 解决的问题
- 具体操作流程
window frame属性
window frame的概念
1. window frame的影响
- 如果
widget
作为⼀个窗⼝ (带有标题栏, 最⼩化, 最⼤化, 关闭按钮), 那么在计算尺⼨和坐标的时候就有两种算法,看是否包含window frame
和 不包含window frame
这两种类型 - 其中
x(), y(), frameGeometry(), pos(), move()
都是按照包含window frame
的⽅式来计算的 - 其中
geometry(), width(), height(), rect(), size()
则是按照不包含window frame
的⽅式来计算的 - 当然, 如果⼀个不是作为窗⼝的 widget , 上述两类⽅式得到的结果是⼀致的.
2. 图片演示
- 可以通过一些特殊的API接口把
window frame
窗口框架(该操作系统自带的
)给隐藏掉,比如说一些游戏的运行窗口界面的窗口框架就可以隐藏
3. 代码演示
- 问题一:下面打印出来的两个坐标不是一样的吗?这是怎么回事。咱们在此处是直接针对
widget
对象来观察区别,而当前代码是放到了构造函数中,此时这个widget
对象正在构造,还没有被加入到window frame
中,因此此时还看不到window frame
的影响
- 问题一的解决方案:直接定义该按钮的槽函数(
转到槽定义
),点击按钮后,再去打印这两者原点的坐标
API接口
API | 说明 |
---|---|
x() | 获取横坐标 |
y() | 获取纵坐标 |
pos() | 返回 QPoint 对象,里面包含 x(), y(), setX(), setY() 等方法 |
frameSize() | 返回 QSize 对象 |
frameGeometry() | 返回 QRect 对象 上面五种(包括这一种)计算时包含 window frame |
width() | 获取宽度 |
height() | 获取高度 |
size() | 返回 QSize 对象,里面包含 width(), height(), setWidth(), setHeight() 等方法 |
rect() | 返回 QRect 对象 |
geometry() | 返回 QRect 对象。QRect 相当于 QPoint 和 QSize 的结合体。可以获取 x, y, width, height |
setGeometry() | 直接设置窗口的位置和尺寸。可以设置 x, y, width, height, 或者 QRect 对象。 上面六种(包括这一种)计算时不包含 window frame 对象 |
- 认真观察上⾯的表格, 可以看到, 其实这⾥的 API 有
frameGeometry
和geometry
两个就⾜够完成所有的需求了。为什么要提供这么多功能重复的 API 呢? - 这个就涉及到 Qt API 的设计理念了: 尽量符合⼈的直觉。举个例子,Qt 的
QVector
的尾插元素操作,有方法:push_back,append,+=
,上述⽅法的效果都是等价的,即使不翻阅⽂档, 单纯的凭借直觉就能把代码写对。
widget.cpp(测试代码)
#include "widget.h"
#include "ui_widget.h"
#include<QDebug>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);
// QRect rect1 = this->geometry();
// QRect rect2 = this->frameGeometry();// // 打印这两的原点坐标 + 宽度与高度
// qDebug() << rect1;
// qDebug() << rect2;
}Widget::~Widget()
{delete ui;
}void Widget::on_pushButton_clicked()
{QRect rect1 = this->geometry();QRect rect2 = this->frameGeometry();// 打印这两的原点坐标 + 宽度与高度qDebug() << rect1;qDebug() << rect2;
}
windowTitle属性
API接口
API | 说明 |
---|---|
windowTitle() | 获取到控件的窗口标题 |
setWindowTitle(const QString& title) | 设置控件的窗口标题,传参支持隐式类型转换,直接传字符串即可 |
问题 + 注意点
- 问题二的原因:当前的
windowTitle(窗口标题)
属性是从属于QWidget
的,QWidget
是一个广泛的概念,而该属性只能针对顶层窗口这样的QWidget
才有效 - 注意点:当前不应该给按钮设置
windowsTitle
,但是实际设置之后,没有任何效果,也没有报错,但此时没有报错
它这样的设定是不科学的,关于这一点,咱们更希望当代码写出不科学的代码的时候,能够给一些报错提示
widget.cpp(属性用法)
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);this->setWindowTitle("这是窗口标题");
}
windowIcon属性
API接口
API | 说明 |
---|---|
windowIcon | 获取到控件的窗口标题,返回QIcon 对象 |
setWindowIcon(const QIcon& icon) | 设置控件的窗口图标 |
同windowTitle,上述操作仅针对顶层
widget
有效
啥是窗口图标
- 先来说一下这个
QIcon
对象,Qt把各种涉及到的相关概念都封装成了类,而QIcon就表示一个图标
玩法
1. 先看代码 + 效果图
代码虽然简单,但牵扯到的东西却不这么点,
特别注意路径和图片文件名别带中文,别带中文!!!带了后,一堆麻烦事,下面的代码虽然能成功,但有隐患,坑留在了具体操作流程的最后一步
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);// 设置图标--要包含头文件(头文件就是类名)--文件名别带中文QIcon icon("C:/Users/dx156/Pictures/微信图片_20250418202557.jpg");this->setWindowIcon(icon);
}
2. icon传参问题(特别注意)
- 传参传的是本地图片的路径,该路径最好不要带有中文!!!我上面的中文是文件名,
C:\Users\dx156\桌面\solidworks.png
(传入此参数,这种写法带有中文路径) - 这里咱们得使用
/
作为路径之间的分隔符,也就是上面代码的写法,不可使用\
反斜杠作为分隔符,因为它会作为转义字符,比如\r
这两字符就被视为是一个字符(回车符
)- 因此为了解决这个问题,除了用
/
作为路径之间的分隔符外,C++11中引入了raw string(原始字符串)
去解决上述问题,即字符串里不包含任何转义字符(所有的字符都不会转义) - 当然针对转义字符还可以使用双双反斜杠
\\
- 因此为了解决这个问题,除了用
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);// 设置图标--要包含头文件(头文件就是类名)QString text = R"(C:\Users\dx156\Pictures\微信图片_20250418202557.jpg)";QIcon icon(text);this->setWindowIcon(icon);
}
- 这里的
QIcon
对象是在栈上创建,之前推荐使用堆来创建对象,主要是因为要确保当前的控件的生命周期是足够的,且要通过Qt对象树来释放对象,而Qlcon
自身是一个比较小的对象,创建出来之后,就是要设置到某个QWidget
里面,而且Qlcon
对象本身释放不释放,不影响图标最终的显示,另外lcon也不支持对象树,无法给他执行父对象
qrc机制(重点)
绝对路径与相对路径
- 绝对路径的问题:上述代码传参传的该图片的地址是
绝对路径
,通过绝对路径的方式引入图片是不科学的,毕竟你写的程序最终是要发布到用户的电脑上的,那你无法确保,你开发机上图片的路径和用户电脑上图片的路径完全一致,比如咱们这个电脑是把图片放到D盘上,那有可能用户电脑上只有一个C盘没有D盘咋办 - 因此相比于使用绝对路径的方式,使用相对路径是更好的
- 相对路径,是以给定目录为基准,以
.
或者..
的方式开头 - 假设基准目录是
D:/
,给定相对路径:./rose.jpg
→在基准目录 (D:/
)直接找rose.jpg
,给定的相对路径是./image/rose.jpg
→ 在基准目录中,先找到image
目录,再在里面找到rose.jpg
- 这个
..
就是到上一级路径中去找,.
就是到当前在哪个各路径(基准路径)就从哪个路径开始找
- 相对路径,是以给定目录为基准,以
- 相对路径的问题:以相对路径的形式引入图片,把图片和可执行程序放在一个相对合适的位置,比绝对路径这种方式更好一点。不过要把图片和可执行程序以相对路径这个文件一起打包发给用户,但也无法确保这个文件不会被用户搞丢
啥是qrc机制 + 解决的问题
- qrc 机制就是从根本上解决上述的两个问题
- 确保你的图片所在的路径在目标用户机器上存在
- 确保你的图片不会被用户搞没了
- 给 Qt 项目引入一个额外的xml 文件(后缀名使用
.qrc
表示)在这个 xml 中把要使用的图片资源给导入进来,并且在xml中进行记录。Qt在编译项目的时候,就会根据qrc
中描述的图片信息,找到图片内容,并且提取出图片的二进制数据,把这些二进制数据转成C++代码,最终编译到exe里。 - qrc 缺点:无法导入太大的资源文件,比如搞几个 GB这种视频文件,qrc 无能为力了
具体操作流程
-
在项目中创建一个
qrc
文件,文件名不要带中文和特殊符号,直接下一步,下一步
-
来到这个界面后,点击
Add Prefix
把图片导入到qrc
中
-
先创建一个前缀(
Prefix
),把Prefix
的名字改成/
即可
- 所谓的
前缀
可以理解成虚拟的目录,这个目录没有在你的电脑上真实存在,是Qt 自己抽象出来的。qrc 机制本质上就是把图片的二进制数据转成C++代码(最终就会在代码中看到很大的char数组,里面就是图片的二进制数据),那为了方便 Qt 代码中访问到这个图片,Qt 就自己抽象出了 虚拟的目录 - 下面的文件是要完整操作了整个流程才会生成的,放在这里是为了辅助理解上面的话语。那
qrc
中导入的图片资源就会被转成这个qrc_resource_cpp
这个C++代码,下面的字节内容就是图片文件(.jpg
)里每个字节的数据,当Qt项目进行编译的时候,这个cpp文件就被一起编译到了exe中,当exe程序运行的时候,上述图片的数据也被加载到内存中(这是qrc机制工作的本质所在)
- 所谓的
-
把你要使用的图片给导入到资源文件中。这个按钮在创建
prefix
之前是禁用的,创建好prefix
之后就可以使用了,添加的文件就是添加到prefix
下面的
-
进行上一步之后,会出现如下问题。因为点击
Add Files
得到的目录就是当前代码所在的目录
-
将你的图片拷贝到当前项目目录中即可。鼠标放在
widget.cpp
文件上,右键点击选择在Explorer中显示
,将图片拷贝到此目录
-
重复第四步。看到下面的这个效果就说明导入成功了
-
创建的前缀叫啥名字,代码中写啥名字。当代码中需要访问
qrc
中管理的文件时,就需要在路径上带有:: + 前缀名+ 文件名
。我这里最终还是遭了殃:文件名也不能是中文的,.jpg前一堆问号
,先把该文件名给改了,然后鼠标右键resource.qrc
打开Open in Editor
重新删除添加文件
#include "widget.h"
#include "ui_widget.h"
#include<QIcon>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);QIcon icon(":/image.jpg");this->setWindowIcon(icon);
}Widget::~Widget()
{delete ui;
}
相关文章:

Qt window frame + windowTitle + windowIcon属性(3)
文章目录 window frame属性window frame的概念1. window frame的影响2. 图片演示3. 代码演示 API接口widget.cpp(测试代码) windowTitle属性API接口问题 注意点widget.cpp(属性用法) windowIcon属性API接口啥是窗口图标玩法1. 先…...
解决:VMware 虚拟机 Ubuntu 系统共享文件夹无法访问问题
以下是解决 VMware 虚拟机 Ubuntu 系统共享文件夹无法访问 问题的完整过程总结,按关键步骤和逻辑顺序梳理: 系统版本:Ubuntu 22.04.5 1. 确认 VMware Tools 已安装 验证方法:通过 ps -ef | grep vmtoolsd 检查是否存在 vmtools…...

Dify源码学习
文章目录 1 大模型基本原理1.1 model_context_tokens、max_tokens和prompt_tokens1.1.1 三者之间的关系1.1.2 总结对比 2 Dify源代码2.0 前后端代码跑起来【0】准备开发环境【1】下载代码【2】运行后端(1)Start the docker-compose stack(2&a…...

静态网站部署:如何通过GitHub免费部署一个静态网站
GitHub提供的免费静态网站托管服务可以无需担心昂贵的服务器费用和复杂的设置步骤,本篇文章中将一步步解如何通过GitHub免费部署一个静态网站,帮助大家将创意和作品快速展现给世界。 目录 了解基础情况 创建基础站点 在线调试站点 前端项目部署 部署…...

【拯救小狗】2022-1-3
缘由c学校练习试题,求解决-编程语言-CSDN问答 void 拯救小狗() {//缘由https://ask.csdn.net/questions/7622294?spm1005.2025.3001.5141int d 0, g 0, tfh[100][3]{}, x 0, c 10, dd d;std::cin >> d >> g; dd d;while (x < g && d…...

PS2025 v26.7 Photoshop2025+AI生图扩充版,支持AI画图
软件下载 【名称】:PS2025 v26.7 Photoshop2025AI生图扩充版 【大小】:4.9G 【语言】:简体中文 【安装环境】:Win10/Win11 【网盘下载链接】(务必手机注册): https://pan.quark.cn/s/51f5…...

怎么开发一个网络协议模块(C语言框架)之(三) 全局实例
1. gVrrpInstance 是什么? 这是 VRRP 全局控制结构体,命名为 vrrpGlbInstance_t,定义了整个协议运行时的 内核资源、全局状态、各类对象池、AVL 树、计时器、套接字等。 它本质上是一个单例(singleton),用于全局访问 VRRP 实例、资源、统计、socket 等。 vrrpGlbInsta…...

ShenNiusModularity项目源码学习(30:ShenNius.Admin.Mvc项目分析-15)
广告管理页面用于新建、维护及删除系统CMS管理模块的广告信息,其后台控制器类AdvListController位于ShenNius.Admin.Mvc项目的Areas\Cms\Controllers内,页面文件位于同项目的Areas\Cms\Views\AdvList内,其中Index.cshtml页面为主页面…...

香港维尔利健康科技集团全面推进AI医疗落地,构建智慧健康管理新模式
在人工智能重塑全球医疗格局的新浪潮中,香港维尔利健康科技集团再次抢占技术高地,宣布正式启动“AI医疗健康场景融合工程”,将人工智能深度嵌入健康管理的全链条服务之中。该计划不仅涵盖设备智能化、诊疗辅助算法、用户健康行为建模等核心环…...
在 .NET 环境下实现跨进程高频率读写数据
目录 ✅ 技术选型说明 📦 示例场景 🧩 数据结构定义 🚦 核心同步机制 🧑💻 消费者实现 ⚡ 性能优化技巧 🛠 部署注意事项 📈 性能基准(理论值) 在 .NET 环境下…...
Arduino和STM32的区别详解
在嵌入式开发领域,Arduino和STM32是两类非常常见的微控制器平台。它们各有优缺点,适用于不同的开发需求。本文将从硬件架构、开发环境、易用性、性能、应用场景等方面对比两者的区别。 ## 一、硬件架构 ### Arduino - **核心芯片**:大多数Ar…...

选择合适的Azure数据库监控工具
Azure云为组织提供了众多服务,使其能够无缝运行应用程序、Web服务和服务器部署,其中包括云端数据库部署。Azure数据库能够与云应用程序实现无缝集成,具备可靠、易扩展和易管理的特性,不仅能提升数据库可用性与性能,同时…...

bi软件是什么?bi软件是做什么用的?
目录 一、BI 软件是什么 1. 基本概念 2. 工作原理 二、BI 软件是做什么用的? 1. 精准洞察市场趋势 2. 优化企业战略规划 3. 辅助投资决策 三、如何选择合适的 BI 软件 1.功能匹配度 2.易用性和可扩展性 3.数据安全和稳定性 4.技术支持和服务 总结 生产…...
DeepSeek 赋能智能电网:从技术革新到全场景应用实践
目录 一、智能电网的发展现状与挑战二、DeepSeek 技术解析2.1 DeepSeek 技术原理2.2 DeepSeek 技术优势 三、DeepSeek 在智能电网中的具体应用3.1 设备管理智能化3.2 电网运行优化3.3 客户服务提升3.4 规划建设智能化3.5 经营管理高效化3.6 办公辅助便捷化 四、DeepSeek 在智能…...
xdvipdfmx:fatal: File ended prematurely. No output PDF file written.
今天忽然遇到:使用xelatex或lualatex编译,一直卡住,不报错,也无法生成PDF,主动停止编译后就报错 xdvipdfmx:fatal: File ended prematurely. No output PDF file written. 然后,之前能正常编译的一些文件…...
python进行while遍历的常见错误解析
Python中使用while循环进行遍历时,常见的错误类型及解析如下: 一、循环条件错误 错误示例: i 0 lst [1,2,3] while i < len(lst): # 实际索引范围应为[0,2]print(lst[i])i 1错误分析: 当 i 3 i3 i3时,条件 …...

锐化算子构建方法(机翻)
为了充分利用 GIP(通用图像处理单元)的并行处理能力,像素组的规模保持较小。每组像素数量的最小化可最大化可并行实现的独立内核数量。理想情况下,若处理单元可获取给定邻域的每个像素值,则内核可完全通用(…...
GO语言学习(七)
GO语言学习(七) 上一期我们简单地带大家手把手实践一下利用GO来构建服务器,大家是不是很不接里面为啥是这样操作的,所以这一期我们就来带领大家一起学习这些是如何实现web的工作,了解其底层实现方式,任何语…...

算法中的数学:费马小定理
1.同余式 定义:如果两个整数a,b模p的余数相同,那么a,b就是模p的同余式 记作: 性质: 1.同加性:若a和b同时加一个整数,那么他们加完之后的两个数模p仍为同余式 2.同乘性:若a和b同时乘一个整数&…...
【TypeScript】知识点梳理(四)
#没事去翻翻官网文档,其实有很多用法是我们还不知道的,官方资料总是最权威的,也推荐大家无聊看看各个官网hhh,不一定是记忆,但在某种场景下我们或许能想到还有多一种解决方式# noImplicitAny 当我们没有表明类型时&…...

【Python 算法零基础 4.排序 ③ 插入排序】
目录 一、引言 二、算法思想 三、算法分析 1.时间复杂度 2.空间复杂度 3.算法的优点和缺点 ① 算法的优点 ② 算法的缺点 四、实战练习 1491. 去掉最低工资和最高工资后的工资平均值 思路与算法 ① 插入排序算法 (insertSort 方法) Ⅰ、初始化 Ⅱ、遍历未排序元素 Ⅲ、元素后移…...

LangGraph实现多智能体的方法
生活中我们常常需要同时处理多个任务,比如预订旅行时,既要订机票,又要订酒店。如果有一个智能助手能同时帮你搞定这些事情,那该有多方便啊!LangGraph的多智能体系统就能做到这一点。它就像一个超级助手团队,…...
wordpress主题开发中常用的12个模板文件
在WordPress主题开发中,有多种常用的模板文件,它们负责控制网站不同部分的显示内容和布局,以下是一些常见的模板文件: 1.index.php 这是WordPress主题的核心模板文件。当没有其他更具体的模板文件匹配当前页面时,Wor…...

聚铭安全管家平台2.0重磅发布——大模型智驱高效降本新方向
【聚铭安全管家平台2.0正式发布】在数字化安全威胁日益严峻的背景下,聚铭网络创新推出安全管家平台2.0,首创"云端智能区域中台本地终端"三级协同架构,深度融合AI安全大模型技术,实现威胁智能研判与自动化响应。该平台通…...
Android singleTop启动模式开启新页面
在Android开发中,Activity的启动模式(Launch Mode)对应用的行为和用户体验影响非常大。其中,singleTop是一种常见的启动模式,但它常常让开发者困惑:当一个Activity设置为singleTop时,如何才能重新打开一个新的页面(实例)? 本文将详细解析singleTop启动模式的机制,为…...

使用注解动态映射:根据实体List列表动态生成Excel文件
我们一般通过POI来生成对应的Excel文件,绝大多数情况是需要手动编写单元格内容,然后顺序填充值,今天我们将动态根据实体来生成Excel表头,同时自动填充内容。 文章目录 1. 定义注解2. 实体类应用注解3. 动态导出工具类 1. 定义注解…...

基于cornerstone3D的dicom影像浏览器 第二十一章 显示DICOM TAGS
系列文章目录 第一章 下载源码 运行cornerstone3D example 第二章 修改示例crosshairs的图像源 第三章 vitevue3cornerstonejs项目创建 第四章 加载本地文件夹中的dicom文件并归档 第五章 dicom文件生成png,显示检查栏,序列栏 第六章 stack viewport 显…...

【循环位运算——uint32,DP】
题目 代码 #include <bits/stdc.h> using namespace std; using ll long long; using uint unsigned;const int N 1010;ll f[N][N]; uint a[N]; int n, m;int main() {ios::sync_with_stdio(0);cin.tie(0);cin >> n >> m;for(int i 1; i < n; i)cin …...

贪心介绍 LeetCode 455.分发饼干 LeetCode 376. 摆动序列 LeetCode 53. 最大子序和
贪心介绍 贪心的本质是选择每一阶段的局部最优,从而达到全局最优。 eg: 有一堆钞票,你可以拿走十张,如果想达到最大的金额,你要怎么拿? 指定每次拿最大的,最终结果就是拿走最大数额的钱。每次拿最大的就…...
算法学习笔记·数学·快速幂
题目:(AcWing) 给定 n 组 ai,bi,pi,对于每组数据,求出 aibimodpi 的值。 输入格式 第一行包含整数 n。 接下来 n 行,每行包含三个整数 ai,bi,pi。 输出格式 对于每组数据,输出一个结果,表示 abiimodpi 的值。 每…...