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

文章目录

  • 前言:
  • 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.mfbz.cn/a/603696.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Deepsort算法研究

目录 1. 基于检测的多目标跟踪策略 1.1 多目标跟踪任务模型 1.2 多目标跟踪算法 SORT 1.3 DeepSORT 算法 2 . 基于轨迹的学生行为分类模型 2.1 学生行为分类规则 2.2 实际场景分析 1. 基于检测的多目标跟踪策略 多目标跟踪任务涉及跟踪多个目标的身份信息关联&#x…

C++类和对象(基础篇)

前言&#xff1a; 其实任何东西&#xff0c;只要你想学&#xff0c;没人能挡得住你&#xff0c;而且其实学的也很快。那么本篇开始学习类和对象&#xff08;C的&#xff0c;由于作者有Java基础&#xff0c;可能有些东西过得很快&#xff09;。 struct在C中的含义&#xff1a; …

组件通信-props详解

目录 一、什么是prop 二、props校验 三、组件中prop和data的区别 一、什么是prop Prop定义&#xff1a;组件上注册的一些自定义属性。 Prop作用&#xff1a;向子组件传递数据。 特点&#xff1a; 可以传递任意数量的prop可以传递任意类型的prop 二、props校验 组件的pr…

智能化采购管理系统助力光伏行业提高效率

光伏行业是指太阳能电池板的制造、安装和维护等相关产业&#xff0c;是新能源领域的重要组成部分。近年来&#xff0c;随着全球对于环保和可持续发展的重视&#xff0c;光伏行业进入全球化和智能化的新阶段。光伏企业开始加强国际合作&#xff0c;推广智能化技术&#xff0c;提…

数据结构学习/复习11--二叉树分治与递归思想练习题

一、二叉树相关练习题 1.判断单值二叉树 2. 判断两颗树是否相同 3.先序遍历的实现 注意事项&#xff1a;此处中的数组的下标用指针控制&#xff0c;因为受到递归与函数栈帧创建与销毁的影响。最后的返回值是指向前序遍历排好后的数组指针 4.判断一棵树是否是另一棵树的子树 …

速来get!多微信聚合聊天功能大揭秘!

随着网络时代的发展&#xff0c;微信成为了职场中不可或缺的沟通工具&#xff0c;很多人都有着多个微信号&#xff0c;而要想高效管理这些账号&#xff0c;那就少不了工具的帮忙。 通过微信管理系统&#xff0c;可以轻松实现多个微信号聚合聊天&#xff0c;提高沟通效率。 1、…

电商风口的最后一班快车?有些人甚至正在All in视频号!

我是王路飞。 当抖音、快手、淘宝上的商家还在内卷的时候&#xff0c;有些人却转移了阵地&#xff0c;搭上了电商风口的“最后一般列车”&#xff0c;甚至正在All in 视频号。 内容来源于【醒醒团队-电商王路飞】 随着“微视”想要三分天下野心的失败&#xff08;与抖音、快手…

ansible 深入介绍之 主机清单与playbook

目录​​​​​​​ 一 inventory 主机清单 1&#xff0c;主机清单 是什么 2&#xff0c;主机清单 定义方式 2.1 自定义主机端口 2.2 定义 范围ip 地址 2.3 定义 拥有相似的主机名 3&#xff0c; inventory 中的变量 3.1 常见 变量 3.2 主机变量 3.3 组变量 3.…

c语言练习5.8

1.分析代码 VS开发环境调试下面的代码&#xff0c;画图解释下面代码的问题 #include <stdio.h> int main() {int i 0;int arr[] {1,2,3,4,5,6,7,8,9,10};for(i0; i<12; i){arr[i] 0;printf("hello bit\n");}return 0; } 分析: 2.喝汽水问题 喝汽水&a…

Python数据可视化------地图

基础地图使用 # 地图基本演示 # 导包 from pyecharts.charts import Map from pyecharts.options import TitleOpts, VisualMapOpts# 准备地图对象 cmap Map() # 准备数据&#xff08;列表&#xff09; data [("北京市", 99), ("上海市", 199), ("…

淘宝扭蛋机小程序,开启你的惊喜探索之旅!

亲爱的淘宝用户们&#xff0c;我们非常高兴地宣布&#xff0c;全新的淘宝扭蛋机小程序即将上线&#xff01;这是一款集合了趣味、惊喜与购物乐趣于一体的创新应用&#xff0c;让你在淘宝的海洋里&#xff0c;找到那份独特的快乐。 一、淘宝扭蛋机小程序是什么&#xff1f; 淘…

后端常用技能:解决java项目前后端传输数据中文出现乱码、问号问题

0. 问题背景 最近做一个解析数据的小工具&#xff0c;本地运行时都正常&#xff0c;发布到服务器上后在导出文件数据时发现中文全部变成了问号&#xff0c;特此记录下问题解决的思路和过程 1. 环境 java 1.8 springboot 2.6.13 额外引入了fastjson&#xff0c;commons-csv等…

Linux网络编程:TCP编程实现

目录 1、前言 2、函数介绍 2.1 socket函数 与 通信域 2.2 bind函数 与 通信结构体 2.2.1 domain通信地址族 与 通信结构体 2.2.2 IPv4地址族结构体 2.2.3 通用地址族结构体 2.2.4 示例&#xff1a;为套接字fd绑定通信结构体addr 2.3 listen函数 与 accept函数 …

onlyoffice容器打包成镜像

书接上篇&#xff0c;onlyoffice容器已经更改在本地docker环境中了&#xff0c;之后需要部署到测试环境的docker中&#xff0c;采用容器打包成本地镜像 1、本地docker 查看容器&#xff1a;docker ps 生成镜像&#xff1a;docker commit -p blissful_lichterman 重命名镜像&a…

MySql表的增删查改(CRUD)

对表中的数据操作分为4大类&#xff0c;增加数据&#xff0c;删除数据&#xff0c;查找数据&#xff0c;修改数据。对表中的数据进行增删查改操作简称为CRUD。Create(增),Retrieve(查找),Updata(修改&#xff09;,Delete(删除)CRUD的操作是对表中的数据进行操作的&#xff0c;是…

RTT PIN设备学习

获取GPIO编号 GET_PIN(port, pin)#define LED_BLUE_PIN GET_PIN(A, 0)设置引脚模式 void rt_pin_mode(rt_base_t pin, rt_base_t mode);设置引脚电平 void rt_pin_write(rt_base_t pin, rt_base_t value);rt_base_t pin 同上&#xff0c; 为引脚编号&#xff0c;尽量通过宏定…

c++ socket基于TCP

linux网络编程基础api socket 地址api&#xff1a;ip地址和端口对&#xff0c;成为 soccket 地址。 socket 基础api&#xff1a; sys/socket.h 中&#xff0c;包括创建、命名、监听 socket &#xff1b;接受连接、发起连接、读写数据、获取地址信息、检测带外标记、读取设置 s…

网络机顶盒哪个牌子好?经销商整理热门网络机顶盒排名

做实体数码店多年来&#xff0c;网络机顶盒这行我非常了解&#xff0c;各种品牌的网络机顶盒我们全销售过。近来很多朋友咨询我网络机顶盒哪个牌子好&#xff0c;我按照店内近一个季度的销量情况整理了是实体店最畅销的网络机顶盒排名&#xff0c;最受欢迎的品牌是以下这些&…

WM Shell多动画场景处理

Shell导致的内存泄漏 基本上都是某个动画未正常结束&#xff0c;执行时间太久导致后续动画堆积或被merge到异常动画导致相关Surface得不到释放导致的。 某个Transition执行时间太久导致后续动画堆积 Visible layers 中有1558 个Transition Root相关layer Visible layers (c…

卡牌——蓝桥杯十三届2022国赛大学B组真题

样例输入 4 5 1 2 3 4 5 5 5 5样例输出 3样例说明 这 5 张空白牌中,拿2张写1,拿1张写2,这样每种牌的牌数就变为了3,3,3,4, 可以凑出 3套牌,剩下2张空白牌不能再帮助小明凑出一套。 评测用例规模与约定 对于30%的数据&#xff0c;保证n ⩽ \leqslant ⩽ 2000; 对于100%的数据…
最新文章