【Qt开发】常用控件(四)

目录

[1 -> windowTitle](#1 -> windowTitle)

[1.1 -> 相关 API](#1.1 -> 相关 API)

[1.2 -> 代码示例](#1.2 -> 代码示例)

[2 -> windowIcon](#2 -> windowIcon)

[2.1 -> 相关 API](#2.1 -> 相关 API)

[2.2 -> 代码示例](#2.2 -> 代码示例)

[2.2.1 -> 设置窗口图标](#2.2.1 -> 设置窗口图标)

[3 -> qrc 机制](#3 -> qrc 机制)

[3.1 -> 代码示例](#3.1 -> 代码示例)


1 -> windowTitle

1.1 -> 相关 API

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

注意:

上述操作针对不同的 widget 可能会有不同的行为。

如果是顶层 widget(独立窗口),这个操作才会有效。

如果是子 widget,这个操作无任何效果。

1.2 -> 代码示例

设置窗口标题

修改 widget.cpp

cpp 复制代码
#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("按钮");
    // 当前不应该给按钮设置window Title,但是设置后无任何效果
    // 此时没有报错
    button->setWindowTitle("通过按钮设置窗口标题");
    button->move(150, 150);
}

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

2 -> windowIcon

2.1 -> 相关 API

|---------------------------------------|----------------------------|
| API | 说明 |
| windowIcon() | 获取到控件的窗口图标,返回 QIcon 对象 |
| setWindowIcon(const QIcon& icon) | 设置控件的窗口图标 |

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

2.2 -> 代码示例

2.2.1 -> 设置窗口图标

1. 先在 D 盘中放一个图片,名字为 title.jpg

2. 修改 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 icon("E:/Gitee_Qt/qt-daily-learning/QWidget_7/title.jpg");
    QIcon icon(":/title.jpg");
    this->setWindowIcon(icon);

}

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

注意:

Windows 下路径的分隔符可以使用 / 也可以使用 \ 。但是如果在字符串中使用 \,需要写作转义字符的形式 \\ 。因此推荐使用 / 。

3. 运行程序,可以看到窗口图标已经成为上述图片

与此同时,程序在任务栏中的图标也发生改变。

实际开发中,一般不会在代码中通过绝对路径引入图片,因为我们无法保证程序发布后,用户的电脑上也有同样的路径。

如果使用 相对路径,则需要确保代码中的相对路径写法和图片实际所在的路径匹配(比如代码中写作 "./images/title.jpg",就需要在当前工作目录中创建 images 目录,并把 title.jpg 放进去)。

绝对路径:以盘符(windows)或者以 / (Linux)开头的路径。

相对路径:以 . (表示当前路径)或者以 .. (表示当前路径上级路径)开头的路径。其中 . 经常也会省略。相对路径的前提是需要明确 "当前工作目录"。

对于 Qt 程序来说,当前工作目录可能是变化的。比如通过 Qt Creator 运行的程序,当前工作目录是项目的构建目录;直接双击 exe 运行,工作目录则是 exe 所在目录。

所谓构建目录,是和 Qt 项目并列的,专门用来放生成的临时文件和最终 exe 的目录。

3 -> qrc 机制

在 Qt 中使用 qrc 机制更方便的来管理项目依赖的静态资源。

qrc 文件是一种 XML 格式的资源配置文件,它用 XML 记录硬盘上的文件和对应的随意指定的资源名称。应用程序通过资源名称来访问这些资源。

在 Qt 开发中,可以通过将资源文件添加到项目中来,方便访问和管理这些资源。这些资源文件可以位于 qrc 文件所在目录的同级或其子目录下。

在构建程序的过程中,Qt 会把资源文件的二进制数据转成 cpp 代码,编译到 exe 中。从而使依赖的资源变得 "路径无关"。

这种资源管理机制并非 Qt 独有,很多开发框架都有类似的机制。例如 Android 的 Resource 和 AssetManager 也是类似的效果。

3.1 -> 代码示例

通过 qrc 管理图片作为图标

1. 右键项目,创建一个 Qt Resource File(qrc 文件),文件名随意起(最好不要带中午),此处叫做 resource.qrc。

2. 在 qrc 编辑器中,添加前缀。

此处前缀设置成 / 即可。

所谓前缀,可以理解成 "目录"。这个前缀决定了后续我们如何在代码中访问资源。

3. 在资源编辑器中,点击 add Files 添加资源文件。

注意:

添加的文件必须是在 qrc 文件的同级目录,或者同级目录的子目录中。因此需要把存储在其他位置的文件复制到项目所在的文件夹中。

4. 在代码中使用 title.jpg

编辑 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 icon("E:/Gitee_Qt/qt-daily-learning/QWidget_7/title.jpg");
    QIcon icon(":/title.jpg");
    this->setWindowIcon(icon);

}

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

注意上述路径的访问规则

  • 使用 : 作为开头,表示从 qrc 中读取资源
  • / 是上面配置的前缀
  • title.jpg 是资源的名称

需要确保代码中编写的路径和添加到的 qrc 中资源的路径匹配。否则资源无法被访问(同时也不会有报错提示)。

5. 运行程序,可以,看到图标已经能正确设置。

可以进入到项目的构建目录,可以看到,目录中多了一个 qrc_resource.cpp

上述代码其实就是通过 unsigned char 数组,把 title.jpg 中的每个字节都记录下来,这些代码会被编译到 exe 中。后续无论 exe 被复制到哪个目录下,都确保能够访问到该图片资源。

上述 qrc 这一套资源管理方案,优点和缺点都很明显。

优点:确保了图片,字体,声音等资源能够真正做到 "目录无关",无论如何都不会出现资源丢失的情况。

缺点:不适合管理体积大的资源。如果资源比较大(比如几个 MB 的文件),或者资源特别多,生成的最终的 exe 体积就会比较大,程序运行消耗的内存也会增大,程序编译的时间也会显著增加。


感谢各位大佬支持!!!

互三啦!!!

相关推荐
千里镜宵烛8 分钟前
深入理解 Linux 线程:从概念到虚拟地址空间的全面解析
开发语言·c++·操作系统·线程
Eternity_GQM21 分钟前
【Word VBA Zotero 引用宏错误分析与改正指南】【解决[21–23]参考文献格式插入超链接问题】
开发语言·c#·word
张柏慈1 小时前
JavaScript性能优化30招
开发语言·javascript·性能优化
promising-w1 小时前
【嵌入式C语言】六
c语言·开发语言
打不了嗝 ᥬ᭄2 小时前
Linux 信号
linux·开发语言·c++·算法
ZLRRLZ2 小时前
【C++】C++11
开发语言·c++
全栈软件开发2 小时前
PHP域名授权系统网站源码_授权管理工单系统_精美UI_附教程
开发语言·ui·php·php域名授权·授权系统网站源码
誰能久伴不乏2 小时前
Qt 动态属性(Dynamic Property)详解
开发语言·qt
草莓熊Lotso3 小时前
《吃透 C++ 类和对象(中):const 成员函数与取地址运算符重载解析》
c语言·开发语言·c++·笔记·其他