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. 代码演示

  1. 问题一:下面打印出来的两个坐标不是一样的吗?这是怎么回事。咱们在此处是直接针对widget对象来观察区别,而当前代码是放到了构造函数中,此时这个widget对象正在构造,还没有被加入到window frame中,因此此时还看不到window frame的影响
    在这里插入图片描述
  2. 问题一的解决方案:直接定义该按钮的槽函数(转到槽定义),点击按钮后,再去打印这两者原点的坐标
    在这里插入图片描述

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 有 frameGeometrygeometry 两个就⾜够完成所有的需求了。为什么要提供这么多功能重复的 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 无能为力了

具体操作流程

  1. 在项目中创建一个qrc文件,文件名不要带中文和特殊符号,直接下一步,下一步
    在这里插入图片描述

  2. 来到这个界面后,点击Add Prefix把图片导入到 qrc
    在这里插入图片描述

  3. 先创建一个前缀(Prefix),把Prefix的名字改成/即可
    在这里插入图片描述

    • 所谓的前缀可以理解成虚拟的目录,这个目录没有在你的电脑上真实存在,是Qt 自己抽象出来的。qrc 机制本质上就是把图片的二进制数据转成C++代码(最终就会在代码中看到很大的char数组,里面就是图片的二进制数据),那为了方便 Qt 代码中访问到这个图片,Qt 就自己抽象出了 虚拟的目录
    • 下面的文件是要完整操作了整个流程才会生成的,放在这里是为了辅助理解上面的话语。那qrc中导入的图片资源就会被转成这个qrc_resource_cpp这个C++代码,下面的字节内容就是图片文件(.jpg)里每个字节的数据,当Qt项目进行编译的时候,这个cpp文件就被一起编译到了exe中,当exe程序运行的时候,上述图片的数据也被加载到内存中(这是qrc机制工作的本质所在
      在这里插入图片描述
  4. 把你要使用的图片给导入到资源文件中。这个按钮在创建prefix之前是禁用的,创建好prefix之后就可以使用了,添加的文件就是添加到prefix下面的
    在这里插入图片描述

  5. 进行上一步之后,会出现如下问题。因为点击Add Files得到的目录就是当前代码所在的目录
    在这里插入图片描述

  6. 将你的图片拷贝到当前项目目录中即可。鼠标放在widget.cpp文件上,右键点击选择在Explorer中显示,将图片拷贝到此目录
    在这里插入图片描述

  7. 重复第四步。看到下面的这个效果就说明导入成功了
    在这里插入图片描述

  8. 创建的前缀叫啥名字,代码中写啥名字。当代码中需要访问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;
}

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

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

相关文章

Git 分支管理:merge、rebase、cherry-pick 的用法与规范

Git 分支管理&#xff1a;merge、rebase、cherry-pick 的用法与规范 在团队开发和个人项目中&#xff0c;合理管理 Git 分支至关重要。merge、rebase 和 cherry-pick 是最常用的三种分支操作命令。本文将介绍它们的基本用法、适用场景及最佳实践规范&#xff0c;帮助大家更高效…

VR全景制作方法都有哪些?需要注意什么?

VR全景制作是将线下实景场景转化为具有沉浸式体验的全景图像的相关技术流程。通过图像处理和软件拼接等手段及技术&#xff0c;可以制作出VR全景图。后面&#xff0c;我们科普详细的VR全景制作方法指南&#xff0c;顺便介绍众趣科技在相关领域提供的支持方案。 选定拍摄地点与准…

计算机系统结构1-3章节 期末背诵内容

Amdahl定律: 加快某部件执行速度所能获得的系统性能加速比&#xff0c;受限于该部件的执行时间占系统中总执行时间的百分比。 加速比依赖于: 可改进比例&#xff1a;在改进前的系统中&#xff0c;可改进部分的执行时间在总的执行时间中所占的比例。 部件加速比&#xff1a;可改…

JS实现直接下载PDF文件

pdf文件通过a标签直接下载会打开页面&#xff0c;所以&#xff0c;请求该文件的blob文件流数据&#xff0c;再通过window.URL.createObjectURL转成链接&#xff0c;就可以直接下载了。 只需要替换url和文件名称就行&#xff0c;文件名的后缀记得要写上pdf&#xff0c;不然会变成…

深度解析Pytest中Fixture机制与实战案例

一、为什么我们需要Fixture&#xff1f; 在某次金融系统重构项目中&#xff0c;我们的测试团队曾遇到这样的困境&#xff1a;随着测试用例增长到500&#xff0c;使用unittest框架编写的测试代码出现了严重的维护问题——setup方法臃肿不堪&#xff0c;测试数据混乱&#xff0c…

文档结构化专家:数字化转型的核心力量

文档结构化专家:定义、职责与行业应用的全方位解析 一、文档结构化的定义与核心价值 文档结构化是将非结构化或半结构化文档(如文本、图像、表格)转换为计算机可处理的规范化数据形式的过程。其核心在于通过语义解析、信息单元划分和标准化格式(如XML/JSON),实现信息的…

Linux系统管理与编程16番外篇:PXE自动化安装部署OpenEuler24.03LTS

兰生幽谷&#xff0c;不为莫服而不芳&#xff1b; 君子行义&#xff0c;不为莫知而止休。 Preboot Execution Environment 本机服务器操作系统&#xff1a;CentOS7.9.2207 目标服务器安装系统&#xff1a;openEuler-24.03-LTS-SP1-everything-x86_64-dvd.iso 虚拟机&#xff1…

Enhanced RTMP H.265(HEVC)技术规格解析:流媒体协议的新突破

Enhanced RTMP H.265&#xff08;HEVC&#xff09;技术规格解析&#xff1a;流媒体协议的新突破 “每一帧画面都是时间的映射&#xff0c;压缩之后的灵魂&#xff0c;依然能栩栩如生。” 随着流媒体技术的快速发展&#xff0c;视频编码标准不断推陈出新。H.264/AVC虽然已经成为…

Visual Studio Code 改成中文模式(汉化)

1、打开工具软件&#xff08;双击打开&#xff09; 2、软件左边图标点开 3、在搜索框&#xff0c;搜索 chinese 出现的第一个 就是简体中文 4、点击第一个简体中文&#xff0c;右边会出来基本信息 点击 install 就可以安装了&#xff08;记得联网&#xff09;。 5、安装完右…

Linux--初识文件系统fd

01. C/系统调用文件操作 C/系统调用文件操作 02. 文件系统(ext2)结构 Linux ext2文件系统&#xff0c;上图为磁盘文件系统图&#xff08;内核内存映像肯定有所不同&#xff09;&#xff0c;磁盘是典型的块设备&#xff0c;硬盘分区被划分为一个个的block。一个块的大小(有1MB,…

算法中的数学:欧拉函数

1.相关定义 互质&#xff1a;a与b的最大公约数为1 欧拉函数&#xff1a;在1~n中&#xff0c;与n互质的数的个数就是欧拉函数的值 eg&#xff1a; n1时&#xff0c;欧拉函数的值为1&#xff0c;因为1和1是互质的 n2是&#xff0c;值为2&#xff0c;因为1和2都是互质的 积性函数&…

BaseDao指南

1. BaseDao类 import java.sql.*;/*** 通用的工具类 ,负责连接数据&#xff0c; 执行增删改查的通用方法*/ public class BaseDao {private Connection connection;private PreparedStatement pstm;private ResultSet rs;/*** 建立数据库连接** return*/public Boolean getCon…

SpringBoot JAR 启动原理

文章目录 版本概述JAR 包结构MANIFEST.MF 描述文件JarLauncherArchive 接口launch 方法Handlers.register() 方法getClassPathUrls 方法createClassLoader 方法 时序图参考 版本 Java 17SpringBoot 3.2.4 概述 JAR 启动原理可以简单理解为“java -jar的启动原理” SpringBo…

YOLO11解决方案之速度估算探索

概述 Ultralytics提供了一系列的解决方案&#xff0c;利用YOLO11解决现实世界的问题&#xff0c;包括物体计数、模糊处理、热力图、安防系统、速度估计、物体追踪等多个方面的应用。 YOLO速度估算结合物体检测和跟踪技术&#xff0c;使用YOLO11 模型检测每帧中的物体&#xf…

初识C++:模版

本篇博客主要讲解C模版的相关内容。 目录 1.泛型编程 2.函数模板 2.1 函数模版概念 2.2 函数模版格式 2.3 函数模版的原理 2.4 函数模版的实例化 1.隐式实例化&#xff1a;让编译器根据实参推演模板参数的实际类型 2. 显式实例化&#xff1a;在函数名后的<>中指定模…

人工智能100问☞第27问:神经网络与贝叶斯网络的关系?

神经网络与贝叶斯网络是两种互补的智能模型:神经网络通过多层非线性变换从数据中学习复杂模式,擅长大规模特征提取和预测,而贝叶斯网络基于概率推理建模变量间的条件依赖关系,擅长处理不确定性和因果推断。两者的融合(如贝叶斯神经网络)结合了深度学习的表征能力与概率建…

【node.js】入门基础

个人主页&#xff1a;Guiat 归属专栏&#xff1a;node.js 文章目录 1. Node.js简介1.1 Node.js的核心特点1.2 Node.js适用场景 2. 第一个Node.js程序2.1 创建并运行Hello World2.2 创建简单的HTTP服务器 3. Node.js核心概念3.1 模块系统3.1.1 创建和导出模块3.1.2 导入和使用模…

百度飞桨PaddleOCR 3.0开源发布 OCR精度跃升13%

百度飞桨 PaddleOCR 3.0 开源发布 2025 年 5 月 20 日&#xff0c;百度飞桨团队正式发布了 PaddleOCR 3.0 版本&#xff0c;并将其开源。这一新版本在文字识别精度、多语种支持、手写体识别以及高精度文档解析等方面取得了显著进展&#xff0c;进一步提升了 PaddleOCR 在 OCR …

Android 14 Binderized HAL开发实战指南(AIDL版)

Android 14 Binderized HAL开发实战指南&#xff08;AIDL版&#xff09; 环境要求 Android 14源码编译环境AOSP android-14.0.0_r7分支Soong build系统Java 17 & NDK r25c 项目结构 hardware/interfaces/myservice/ ├── 1.0 │ ├── IMyHalService.aidl # AID…

第九天的尝试

目录 一、每日一言 二、练习题 三、效果展示 四、下次题目 五、总结 一、每日一言 创造美好的代价是努力&#xff0c;失望以及毅力&#xff0c;首先是痛苦&#xff0c;然后才是欢乐。 时间是快的&#xff0c;看怎么利用&#xff0c;安排好一切事情&#xff0c;才能从容面对…