从0到1学习Qt -- 常见控件QWidget(二)

1. windowTitle属性

1.1. windowTitle相关API

|----------------------------------------|------------|
| windowTitle() | 获取到控件的窗⼝标题 |
| setWindowTitle( const QString& title) | 设置控件的窗⼝标题 |

注意! 上述设置操作针对不同的 widget 可能会有不同的⾏为.
如果是顶层 widget (独⽴窗⼝), 这个操作才会有效.
如果是⼦ widget, 这个操作⽆任何效果.

1.2. windowTitle示例

widget.cpp:

cpp 复制代码
#include "widget.h"
#include "ui_widget.h"

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

    this->setWindowTitle("自定义窗口标题");
}

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

示例效果:

2. windowIcon属性

2.1. windowIcon相关API

|-------------------------------------|--------------------------|
| windowIcon() | 获取到控件的窗⼝图标. 返回 QIcon 对象. |
| setWindowIcon(const QIcon& icon) | 设置控件的窗⼝图标. |

同 windowTitle, 上述操作仅针对顶层 widget 有效

2.2. windowIcon示例

改变窗口的图标显示

在widget.cpp中代码:

cpp 复制代码
#include "widget.h"
#include "ui_widget.h"
#include <QIcon>

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

    // 我们在这里讲QIcon对象定义到栈上面是因为QIcon对象不支持挂载到对象树上
    QIcon icon("D:/e8294d974c94197d583306e3bb702864.png");

    this->setWindowIcon(icon);
}

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

我们可以看到改窗口的图标是一朵玫瑰。

2.3. 问题提出

我们在实际的开发中我们⼀般不会在代码中通过绝对路径引⼊图⽚. 因为我们⽆法保证程序发布后, 用户的电脑上也有同样的路径.
如果使⽤相对路径, 则需要确保代码中的相对路径写法和图⽚实际所在的路径匹配 (⽐如代码
中写作 "./image/rose.jpg", 就需要在当前⼯作⽬录中创建 image ⽬录, 并把 rose.jpg 放进去)

这个时候就会出现下面两个问题:

  1. 开发者的文件资源路径和用户的不一致怎么办?
  2. 就算开发者的文件资源路径和用户相同或者相对关系相同,但是用户不小心删除了相关的文件怎么办?

2.4. qrc机制

2.4.1.qrc机制的简要说明

为了解决上述的俩个问题,Qt引入了qrc机制更⽅便的来管理项⽬依赖的静态资源.

qrc ⽂件是⼀种XML格式的资源配置⽂件, 它⽤XML记录硬盘上的⽂件和对应的随意指定的资
源名称. 应⽤程序通过资源名称来访问这些资源.
在Qt开发中, 可以通过将资源⽂件添加到项⽬中来⽅便地访问和管理这些资源. 这些资源⽂件
可以位于qrc⽂件所在⽬录的同级或其⼦⽬录下.
在构建程序的过程中, Qt 会把资源⽂件的⼆进制数据转成 cpp 代码, 编译到 exe 中. 从⽽使依
赖的资源变得 "路径⽆关".这种资源管理机制并⾮ Qt 独有, 很多开发框架都有类似的机制. 例如 Android 的 Resources 和 AssetManager 也是类似的效果.

2.4.2. qrc机制使用示例

代码示例:通过 qrc 管理图⽚作为图标

1.右键项⽬, 创建⼀个 Qt Resource File (qrc ⽂件), ⽂件名随意起(不要带中⽂), 此处叫做 resource.qrc .

  1. 在qrc编辑器中,添加前缀
  1. 在资源编辑器中,点击add FIles添加资源⽂件.

4.在代码中使用

widget.cpp文件:

cpp 复制代码
#include "widget.h"
#include "ui_widget.h"
#include <QIcon>

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

    // 我们在这里讲QIcon对象定义到栈上面是因为QIcon对象不支持挂载到对象树上
    QIcon icon("D:/e8294d974c94197d583306e3bb702864.png");

    this->setWindowIcon(icon);
}

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

3.windowOpacity属性

3.1. windowOpacity相关API

|--------------------|-------------------------------------------------------------------|
| windowOpacity() | 获取到控件的不透明数值. 返回 float, 取值为 0.0 -> 1.0 其中 0.0 表⽰全透明, 1.0 表⽰完全不透明. |
| setWindowOpacity() | 设置控件的不透明数值 |

3.2. windowOpacity示例

调整窗口透明度

widget.cpp代码:

cpp 复制代码
#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 f = this->windowOpacity();

    qDebug() << f;

    if(f >= 1.0)
    {
        return;
    }

    f += 0.1;
    this->setWindowOpacity(f);
}

void Widget::on_pushButton_sub_clicked()
{
    float f = this->windowOpacity();

    qDebug() << f;

    if(f <= 0.0)
    {
        return;
    }

    f -= 0.1;
    this->setWindowOpacity(f);
}

示例效果:点击'+'后窗口的不透明度会增加,点击'-'后窗口的不透明度减小

3.3. 问题提出与回答

我们在上述的代码中明明是对窗口的不透明度的值减少了0.1为什么在终端控制台上面减掉的具体的值不是0.1呢?

要回答这个问题我们就要弄懂以下的东西了。

在C/C++,Java等主流的编程语言中对于浮点数的存储采用的是IEEE的标准来存储浮点数的。该标准讲浮点数分成了三个部分来进行存储:符号位,数值部分,次方数。无论是32位的float类型还是64位的都变了类型要去表示一个小数不是都能做到精确表示的,比如:数值部分要表示0.75,可以用0.5(2^-1) + 0.25(2^-2),但是对于0.654839就无法精确的表示了。

相关推荐
西岸行者4 天前
学习笔记:SKILLS 能帮助更好的vibe coding
笔记·学习
悠哉悠哉愿意4 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
别催小唐敲代码4 天前
嵌入式学习路线
学习
毛小茛4 天前
计算机系统概论——校验码
学习
babe小鑫4 天前
大专经济信息管理专业学习数据分析的必要性
学习·数据挖掘·数据分析
范特西.i4 天前
QT聊天项目(8)
开发语言·qt
winfreedoms4 天前
ROS2知识大白话
笔记·学习·ros2
在这habit之下4 天前
Linux Virtual Server(LVS)学习总结
linux·学习·lvs
我想我不够好。4 天前
2026.2.25监控学习
学习
im_AMBER4 天前
Leetcode 127 删除有序数组中的重复项 | 删除有序数组中的重复项 II
数据结构·学习·算法·leetcode