【Qt】掌握Qt界面开发:窗口属性与资源嵌入技巧解析

news2025/1/15 22:55:10

文章目录

  • 前言:
  • 1. windowTitle: 窗口标题
  • 2. windowIcon:窗口图标
  • 3. qrc 机制:
  • 4. windowOpacity:半透明效果
  • 总结:

前言:

在软件开发中,用户界面(UI)的构建是一个重要环节,它直接影响到用户的使用体验。Qt作为一个跨平台的C++应用程序框架,提供了丰富的工具和类库来帮助开发者创建和管理复杂的用户界面。本文将详细介绍Qt中窗口标题、窗口图标、资源文件(qrc机制)以及窗口透明度等UI元素的设置和使用。通过这些基础知识的掌握,开发者可以更高效地构建出既美观又实用的应用程序界面。

1. windowTitle: 窗口标题

在这里插入图片描述
当前 windowTitle属性,是从属于 QWidget, 但QWidget 是一个广泛的概念。
windowTitle 属性,只能针对顶层窗口这样的QWidget 才有效。

#include "widget.h"
#include "ui_widget.h"
#include <QPushButton>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    this->setWindowTitle("这是窗口标题");

    QPushButton* button = new QPushButton(this);
    button->setText("按钮");
//    button->setWindowTitle("通过按钮设置窗口标题"); // 当前不应该给按钮设置 window Title。
//                                                // 但是实际设置了之后,也没有报错,这样的设定是不太科学的
    connect(button, &QPushButton::clicked, this, [this](){
       this->setWindowTitle("通过按钮设置窗口标题");
    });
}

Widget::~Widget()
{
    delete ui;
}


2. windowIcon:窗口图标

在这里插入图片描述
Qt 把各种涉及到的相关概念,都封装成了
QIcon 就表示一个图标。
这两个 API 类似于 windowTile 只能针对顶层窗口使用。
用它需要先准备好图标的图片。

之前推荐使用堆来创建对象,主要是因为要保证当前控件的生命周期是足够的,要通过 Qt 对象来释放对象。
QIcon自身是一个比较小的对象,创建出来之后,是要设置到某个QWidget里面,QIcon 对象本身释放不释放,不影响图标的最显示。
QIcon 也不支持对象树,无法给他执 行父对象。

#include "widget.h"
#include "ui_widget.h"

#include <QIcon>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    // 设置图标
    QIcon icon("D:/Acode/class111/Qt/TuBiao.png"); // 在栈上创建
    this->setWindowIcon(icon);
}

Widget::~Widget()
{
    delete ui;
}

注意:路径不要带中文,使用 / 作为路径之间的分隔,不能使用 , 在C/C++ 中 \ 是转义字符。在C++ 11 中引入了 raw string 解决上述问题。 字符中不包含任何转义字符(所有的字符都不会转义)r("...")

在这里插入图片描述

QIcon icon("D:/Acode/class111/Qt/TuBiao.png");

通过这种绝对路径的方式引入图片是不科学的。
你写的程序,最终是要发布发到用户电脑上的。
你无法确保,你开发机的图片的路径和用户电脑上图片的路径 完全一致!

因此,相比于使用绝对路径的方式,使用相对路径是更好的。
相对路径,是以给定目录为基准,以 . 或者.. 的方式开头。

3. qrc 机制:

这个机制本质上从根本上解决上述两个问题:

  1. 确保你的图片所在的路径在目标机器上存在
  2. 确保你的图片不会被用户搞没了

给 Qt 项目引入一个额外的 xml 文件(后缀名使用.qrc表示)
在这个xml中要把图片资源给导入进来,并且在xml中进行记录。

Qt 在编译的项目的时候,就会根据qrc 中描述的图片信息,找到图片内容,并提取出图片的二进制数据,把这些二进制数据转换成C++ 代码,最终编译到exe里。

qrc 缺点:无法导入太大的资源,比如搞几个GB这种视频,qrc无能为力了。

qrc 使用的方式:

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

  2. 把图标导入到 qrc 文件中
    在这里插入图片描述
    1) 先创建一个"前缀" (Prefix)
    所谓的"前缀"可以理解成 虚拟目录
    这个目录没有在你的电脑上真实存在,是Qt 自己抽象出来的

    qrc 机制本质上就是把 图片 的的二进制数据转换成C++代码。(最终就会看到很大的char数组,里面就是图片的二进制数据)
    为了方便 Qt 代码访问到这个图片,Qt就自己抽象出了虚拟目录。
    在这里插入图片描述
    把Prefix 的名字就改成 / 即可
    2)点击Add Files把刚才使用 TuBiao.png 给这个图片导入到资源文件中
    在这里插入图片描述
    需要注意的是,图片必须和resource.qrc 在同级目录,或同级目录的子目录中。
    在这里插入图片描述
    像这样就导入成功了。

#include "widget.h"
#include "ui_widget.h"

#include <QIcon>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    // 设置图标
    //QIcon icon("D:/Acode/class111/Qt/TuBiao.png"); // 在栈上创建
    QIcon icon(":/TuBiao.png"); // 用qrc文件存
    this->setWindowIcon(icon);
}

Widget::~Widget()
{
    delete ui;
}

在这里插入图片描述
在这里插入图片描述
当 Qt 项目进行编译的时候, 这个cpp文件就被一起编译到exe中。当exe程序运行的时候,上述图片的数据也被加载到内存中了。

4. windowOpacity:半透明效果

半透明效果(opacity,不透明度,数值越大,越不透明)
在这里插入图片描述

#include "widget.h"
#include "ui_widget.h"
#include <QDebug>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
}

Widget::~Widget()
{
    delete ui;
}


void Widget::on_pushButton_add_clicked()
{
    float opacity = this->windowOpacity();
    if (opacity >= 1.0) {
        return;
    }
    opacity += 0.1;
    qDebug() << opacity;
    this->setWindowOpacity(opacity);
}

void Widget::on_pushButton_sub_clicked()
{
    float opacity = this->windowOpacity();
    if (opacity <= 0.2) {
        return;
    }
    opacity -= 0.1;
    qDebug() << opacity;
    this->setWindowOpacity(opacity);
}

在这里插入图片描述

在这里插入图片描述
两个问题:

  1. 窗口的不透明度,变化并非是精确的!
    我们在C语言中学过,数据在内存中的存储
    1)整数在内存中的存储(原码 反码 补码,字节序)
    2)浮点数在内存中的存储
    在这里是用 IEEE 754 标准的浮点数,二进制科学计数法的方式来表示:
    把一个浮点数分成三个部分:
    1)符号位
    2)有效数字
    3)指数部分

使用二进制表示的有效数字:
而这里是小于 0 的小数部分(默认整数部分是 1)
第一个有效数字位表示 0.5
第二个有效数字位表示 0.25
第三个表示 0.125 …

0.1 这样的小数,由于float 和 double 有效数字部分长度有限的,导致无法凑出一个非常接近 0.1 这样的数字。

平时写代码,千万不能把两个浮点数直接使用 “==” 进行比较
eg : 0.1 + 0.2 == false;
正确的写法是,作差,判定差的绝对值小于预期范围
后续工作中编写代码的时候,尤其涉及到一些需要精确计算的场景,算钱,一定要慎重使用 float / double!

  1. 上述代码中,进行设置之前,先判定了 opacity 的范围,然后再决定是否要设置,这个判定其实可以不写。
float opacity = this->windowOpacity();
if (opacity >= 1.0) {
    return;
}

这里加了判断条件,实际上如果不加这样的条件代码也是ok的
超过 1.0 的数字设置不进去(setWindowOpacity 内部也经行了判定)

那为啥还要写呢? 《代码大全》就进行了详细的讨论
“防御性编程”,别人犯错了,不会对咱们自身构成太大的伤害。

很多时候写代码的时候,往往是要把一个大的项目拆分成几个部分/模块,不同的人负责不同的人负责分别完成。模块之间要互相交互,往往模块A提供API(函数,类)给模块B调用。
你在使用别人提供的API来进行调用的时候,你是否要对传入的参数进行检测呢?
比如你要传一个实参,你也不知道这个参数是否是一个NULL指针。
是否应该在调用函数之前就对这个指针进行判空呢?
代码大全中,给出的结论,要双重判定(double check)

总结:

本文详细介绍了Qt中窗口标题、窗口图标、资源文件(qrc机制)以及窗口透明度的设置方法。首先,我们学习了如何为顶层窗口设置窗口标题,并通过按钮点击事件动态改变窗口标题。接着,探讨了如何为窗口设置图标,包括直接使用QIcon类和利用qrc机制将图标资源嵌入到应用程序中。此外,还讨论了窗口透明度的调整,以及浮点数精度问题对透明度设置的影响。最后,强调了防御性编程的重要性,即在代码中加入适当的检查和判断,以提高程序的健壮性和稳定性。

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

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

相关文章

pandas处理excel问题(记录)

1. pandas读取excel合并单元格问题 网上查到的都是 df[col] df[col].ffill() 这个能解决大部分简单合并的问题&#xff0c;遇到复杂的就不行了遇到上图中 有空的情况&#xff0c;ffill() 也会向下填充。 所以不能通过这种方式 import openpyxl # 拆分所有的合并单元格&#…

JavaSE——方法详解

1. 方法的概念 方法就是一个代码片段 . 类似于 C 语言中的 " 函数 " 。 方法存在的意义 : 1. 是能够模块化的组织代码(当代码规模比较复杂的时候). 2. 做到代码被重复使用, 一份代码可以在多个位置使用. 3. 让代码更好理解更简单. 4. 直接调用现有方法开发, 不…

.net 6.0 框架集成ef实战,步骤详解

一、代码框架搭建 搭建如下代码架构: 重点含EntityFrameworkCore工程,该工程中包含AppDbContext.cs和数据表实体AggregateObject 1、AppDbContext 代码案例 //AppDbContext 代码案例using Microsoft.EntityFrameworkCore;namespace EntityFrameworkCore {public class Ap…

《Linux运维总结:ARM64架构CPU基于docker-compose一离线部署rabbitmq 3.10.25容器版镜像模式集群工具》

总结&#xff1a;整理不易&#xff0c;如果对你有帮助&#xff0c;可否点赞关注一下&#xff1f; 更多详细内容请参考&#xff1a;《Linux运维篇&#xff1a;Linux系统运维指南》 一、部署背景 由于业务系统的特殊性&#xff0c;我们需要面向不通的客户安装我们的业务系统&…

4.用python爬取保存在text中的格式为m3u8的视频

文章目录 一、爬取过程详解1.寻找视频的m3u8链接2.从网页源码中寻找视频的m3u8链接的第二部分内容3.从视频的m3u8链接获取视频 二、完整的代码 一、爬取过程详解 1.寻找视频的m3u8链接 这个文档承接了爬虫专栏的 第一节.python爬虫爬取视频网站的视频可下载的源url&#xff0…

Zlib介绍

1.简介 zlib是一个广泛使用的压缩库&#xff0c;它提供了一系列的函数用于压缩和解压缩数据。zlib使用DEFLATE压缩算法&#xff0c;这是一种无损压缩算法&#xff0c;通常与gzip和zip文件格式一起使用。zlib库本身支持的压缩文件格式是它自己的专有格式&#xff0c;通常用于数…

【密码学原语介绍】PPRF(可穿孔伪随机函数)

在现代密码学中&#xff0c;伪随机函数&#xff08;PRF&#xff09;是构建各种加密协议和系统的基石。它们提供了一种方式&#xff0c;通过它&#xff0c;给定一个密钥和一个输入&#xff0c;可以生成一个无法预测的伪随机输出。这种机制对于确保数据加密、身份验证和完整性验证…

文件IO-使用dup2实现错误日志功能及判断文件权限,并终端输出

1&#xff1a;使用 dup2 实现错误日志功能 使用 write 和 read 实现文件的拷贝功能&#xff0c;注意&#xff0c;代码中所有函数后面&#xff0c;紧跟perror输出错误信息&#xff0c;要求这些错误信息重定向到错误日志 err.txt 中去 代码&#xff1a; #incl…

分享《2024年中国企业级SaaS行业研究报告》

&#xff08;文章作者与来源&#xff1a;艾瑞咨询&#xff09; 大浪淘沙&#xff0c;SaaS行业进入关键转折点&#xff0c;企业级SaaS的总体市场规模达到888亿元&#xff0c;同比增长13.0%。内外部因素叠加之下&#xff0c;预计三年未来企业级SaaS市场规模的增速将稳定在15%-20…

Java17的崛起——newrelic的2024 年 Java 生态系统状

newrelic 2024 年 Java 生态系统状况 原文PDF&#xff1a;点我下载 生产中最常用的 Java 版本 Oracle 每六个月发布一次新的 Java 版本&#xff08;通常是在 3 月和 9 月&#xff09;&#xff0c;每个版本都包含一些新功能和错误修复。每两年&#xff0c;Oracle 都会推出一…

java--io流(一)

1. 前置知识 字符集是什么&#xff1f; 字符集&#xff08;Character Set&#xff09;是一组字符的集合&#xff0c;它定义了可以在计算机系统中使用的所有字符。字符集可以包括字母、数字、标点符号、控制字符、图形符号等。字符集使得计算机能够存储、处理和显示各种语言和…

Baidu Comate智能编码助手 -----AI编程帮你解放双手

目录 Baidu Comate是什么&#xff1f; Baidu Comate如何安装&#xff1f; 在VSCode上安装Baidu Comate插件 Baidu Comate如何使用&#xff0c;有哪些功能&#xff1f; 1.代码解释 2.代码注释 使用感受 如何体验 Baidu Comate是什么&#xff1f; Baidu Comate智能编码助手…

Comate,一款基于文心大模型的智能编程助手

一、官网 Baidu Comate官网 二、安装VSCode 如何下载安装VSCode 三、VSCode安装Comate 安装方式1 访问Comate官网点击 立即安装Comate插件 按钮快速安装 安装方式2 访问VSCode市场中的BaiduComate 点击 Install 按钮访问扩展详情界面 2.打开VSCode 3.安装Comate 四、…

图像降噪算法 NL-means 介绍

介绍 Non-Local Means 非局部均值降噪算法&#xff0c;简称NLM&#xff0c;该算法来自 2005年论文“A non-local algorithm for image denoising”&#xff1b;该算法是经典的图像降噪算法&#xff0c;是很多降噪算法的参考对比算法。 2014 年&#xff0c;有 NLM衍生算法NLMP…

树莓派4b测量PM2.5

1.GP2Y1010AU0F粉尘传感器连接图 2. GP2Y1010AU0F工作原理 工作原理 传感器中心有个洞可以让空气自由流过,定向发射LED光,通过检测经过空气中灰尘折射过后的光线来判断灰尘的含量。 3.源代码 main.py # coding=UTF-8 import RPi.GPIO as GPIO from ADC import ADS1015…

正点原子i.MX 93开发板,双核A55+M33+NPU,双路RS485FDCAN千兆网,异核/AI/工业开发!

正点原子i.MX 93开发板新品上市&#xff01;双核A55M33NPU&#xff0c;双路RS485&FDCAN&千兆网&#xff0c;异核/AI/工业开发&#xff01; NXP的i.MX系列是一系列面向多媒体和工业应用的ARM架构微处理器。从i.MX6U到i.MX93&#xff0c;这一系列经历了显著的发展&#x…

kubectl_进阶_安全

安全 在前面的学习中&#xff0c;我们知道对于资源对象的操作都是通过 APIServer 进行的&#xff0c;那么集群是怎样知道我们的请求就是合法的请求呢&#xff1f; 这就涉及到k8s的安全相关的知识了。 1. API对象 Kubernetes有一个很基本的特性就是它的所有资源对象都是模型…

TypeScript 基础学习笔记:interface 与 type 的异同

&#x1f525; 个人主页&#xff1a;空白诗 文章目录 TypeScript 学习笔记&#xff1a;interface 与 type 的异同&#x1f3a3; 引言&#x1f680; 快速入门1️⃣ Interface&#xff08;接口&#xff09;&#x1f4cb; 定义&#x1f91d; 实现&#x1f4a1; 特点 2️⃣ Type Al…

深度学习网络:设计、开发和部署

​书籍&#xff1a;Deep Learning Networks: Design, Development and Deployment 作者&#xff1a;Jayakumar Singaram&#xff0c;S. S. Iyengar&#xff0c;Azad M. Madni 出版&#xff1a;Springer书籍下载-《​深度学习网络&#xff1a;设计、开发和部署》该教材为学生和工…

Redis 实战之RDB文件结构

RDB文件结构 databases 部分key_value_pairs 部分value 的编码字符串对象列表对象集合对象哈希表对象有序集合对象INTSET 编码的集合ZIPLIST 编码的列表、哈希表或者有序集合 总结AOF持久化的实现命令追加 AOF 文件的写入与同步小结 在本章之前的内容中&#xff0c; 我们介绍了…