【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 体积就会比较大,程序运行消耗的内存也会增大,程序编译的时间也会显著增加。


感谢各位大佬支持!!!

互三啦!!!

相关推荐
用户805533698034 天前
不止三件套:QObject 属性系统全关键字与运行时反射!
c++·qt
xcyxiner4 天前
DicomViewer (vcpkg Windows和ubuntu编译)7
qt
Quz9 天前
QML Hello World 入门示例
qt
xcyxiner12 天前
DicomViewer (dcmtk读取dcm文件)5
qt
xcyxiner13 天前
DicomViewer (后台线程处理文件)4
qt
xcyxiner13 天前
DicomViewer (添加模型类)3
qt
xcyxiner14 天前
DicomViewer (目录调整) 2
qt
xcyxiner14 天前
dcmtk vtk vtk-dicom(gdcm) 编译(debug) v2
qt
LDR00616 天前
Type-C 快充全面升级!LDR6601 赋能个人护理便携电机,重塑剃须刀 / 理发器新体验
c语言·开发语言
雪碧聊技术16 天前
Tree.js是什么?一文讲透
开发语言·javascript·ecmascript