从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就无法精确的表示了。

相关推荐
洛克希德马丁1 小时前
Qt配置安卓开发环境
android·开发语言·qt
我要升天!1 小时前
QT-- 理解项目文件
开发语言·数据库·qt
友善啊,朋友2 小时前
Qt:判断一个sql语句是否是select语句
sql·qt
Lynnxiaowen3 小时前
今天我们开始学习Linux自动化运维Ansible基础
linux·运维·学习·自动化·云计算·ansible
YJlio3 小时前
VMMap 学习笔记(8.2):启动 VMMap、选择目标进程、权限要求与首次快照流程
服务器·笔记·学习
蓝桉~MLGT3 小时前
Python学习历程——模块
开发语言·python·学习
西游音月4 小时前
(4)框架搭建:Qt实战项目之主窗体介绍
开发语言·qt
say_fall4 小时前
C语言编程实战:每日刷题 - day 1
c语言·开发语言·学习
小苏兮4 小时前
【把Linux“聊”明白】进程的概念与状态
linux·运维·服务器·学习