2.3QT资源文件
概述
在实际的QT的应用程序开发,会大量运用图片,图标或者其他类型的文件。Qt也专门定义了一套资源系统,资源文件的格式为*.qrc
。*.qrc
文件通过rcc资源编译器生成一个名称格式为qrc_*.cpp的标准C++文件,可以通过任意C++文件进行编译,与其他的源文件一块链接到目标程序中使用。qrc 文件在编译后会将资源编译链接进程序内部,在发布应用程序的时候就不需要带上一堆文件夹,省去了一切麻烦。如果资源文件太大,超过了 4以上的文件就不建议放在资源文件中,编译会出现错误。这些大的文件可以使用系统路径访问或者外挂资源方式访问
Qt 系统资源系统基于 qmake、rcc 和 QFile 三方面紧密合作,让资源文件的使用与普通操作系统里的文件使用方式很相似,Qt 应用程序内部的资源文件有一套自己的虚拟文件系统,文件路径形式":/save.png" ,冒号开头的就是代表访问内嵌的资源文件。所有内嵌的资源文件都是只读的,在程序运行时不能修改资源里的文件,只能读取使用
2.3.1建立一个资源文件
1)打开 Qt应用程序,新建一个Qt Widgets Application的项目,这里我们把项目的名称命名为ResourceFile
2)鼠标选中工程左边的项目视图文件夹,单击鼠标右键添加新的文件。
注意
只要是该项目的文件夹,任意点击任何一个都是可以的。
3)选择QT资源文件
4)设置资源文件的名称和存放路径
5) 将资源文件添加到当前的项目中
添加成功后,项目中会自动生成一个Resources的文件
- 向资源文件中添加需要内嵌到程序的文件
如图所示:
7)资源文件管理器
鼠标选中 qrc 资源文件,右键->open with–>选择打开资源文件的方式。资源管理器可以修改资源文件的访问路径和别名(程序内部使用的名称)。
之前我们的文件路径是/,现在我们改成w,点击保存
更改后如图所示:
我们也可以给资源文件取别名:
之前的文件名称是2.png。现在我们改成two.png
- 查看资源文件在程序中的访问路径。
选中一个资源文件,鼠标单击右键可以看到两种访问的方法。鼠标左键单击即可复制到裁剪板。
2.3.2qrc文件格式
qrc文件的格式与ui文件一样都是XML格式。
右键单击image.qrc选择open with中的普通文本编辑,点击查看。
例如:
<RCC>
<qresource prefix="/w">
<file alias="two">2.png</file>
</qresource>
</RCC>
<qresource prefix="/w">
:表示了资源文件的前缀
<file alias="two">2.png</file>
:表示资源文件访问的路径。
可以手动修改资源文件内容进行添加新文件。
image.qrc通过rcc工具编译后会生成一个qrc_image.cpp文件
2.3.3设置按钮图标
设置按钮的图标有两种方式,一是通过UI界面进行设置,而是通过setIcon函数进行设置。
1)通过UI界面设置图标
方式一:
右键按钮控件单击转到改变样式表,选择添加资源即可。
注意:下拉按钮选择background-image,然后再选择要添加的背景图片
方式二:
点击按钮控件找到右下角的属性中的icon
2)通过代码方式设置按钮图标
ui->pushButton->setIcon(QIcon(":/image/open-source-line.png"));
ui->pushButton_2->setIcon(QIcon(":/image/plane-fill.png"));
效果图:
(按钮上的文字可以在ui界面上删除)
2.3.4Qt中引用外部资源
为什么需要引用外部资源
前面写到可以使用qrc资源文件,也就是在QT工程中添加资源文件,这种方式对于资源比较少的情况是可以使用,添加的资源的文件qrc.cpp
会直接存放到静态数组中,从而一直占用内存,使内存的利用率不高,如果添加的资源文件过多,甚至会导致编译无法通过,造成out of memory的错误
通过从外部引用资源文件二进制文件,(一般是rcc文件)在程序中进行调用资源文件。
针对于Windows下的QT平台
rcc文件
rcc工具在QT的安装目录下,找到自己的QT的安装目录D:\MyTool\QT\Tools\mingw730_64\bin
。rcc需要在命令行中使用,还需要将rcc工具的路径添加到电脑系统的PATH环境变量中。
注意:添加好环境变量需要重启电脑,否则不生效
在控制面板–>系统和安全—>系统—>高级系统设置–环境变量—>系统变量—>点击path---->点击编辑
1.在项目中新建一个qrc格式的文本文件,名称为ex_resources.qrc
。文件内容如下:
<RCC>
<qresource prefix="/">
<file>image/open-source-line.png</file>
<file>image/plane-fill.png</file>
<file>video/bs.mp4</file>
</qresource>
</RCC>
2.编译资源文件
在该项目路径下,输入cmd打开命名行窗口
输入以下命令:
rcc -binary ex_resources.qrc -o ex_resources.rcc
编译成功后,rcc会把ex_resources.qrc
里面描述的所有图片,视频等文件进行打包压缩生成一个二进制的ex_resources.rcc
文件,这个二进制文件中就包含了所有的资源。
3.引用资源文件的函数
引用外部资源需要在main函数里进行注册。
相关静态函数如下:
static bool registerResource(const QString &rccFilename, const QString &resourceRoot=QString());
static bool unregisterResource(const QString &rccFilename, const QString &resourceRoot=QString());
static bool registerResource(const uchar *rccData, const QString &resourceRoot=QString());
static bool unregisterResource(const uchar *rccData, const QString &resourceRoot=QString());
registerResource 是一个重载函数,可以填资源文件的路径也可以填二进制数据指针。资源文件加载成功返回true,失败返回 false。
unregisterResource 与 registerResource 功能相反,用来注销不使用的资源。
1)注册资源文件格式示例:
QResource::registerResource("ex_resources.rcc");
注意:ex_resources.rcc资源文件的路径根据实际情况填写
完整代码
- pro文件
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
CONFIG += c++11
# The following define makes your compiler emit warnings if you use
# any Qt feature that has been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS
# You can also make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
SOURCES += \
main.cpp \
widget.cpp
HEADERS += \
widget.h
FORMS += \
widget.ui
# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target
- .h文件
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
private:
Ui::Widget *ui;
};
#endif // WIDGET_H
- main.cpp
#include "widget.h"
#include <QApplication>
#include<QDebug>
#include<QResource>
int main(int argc, char *argv[])
{
QResource::registerResource("C:\\Users\\72916\\Desktop\\MyQt\\2_3_4\\ResourcesFile\\ex_resources.rcc");
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}
- widget.cpp
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
ui->pushButton->setIcon(QIcon(":/image/open-source-line.png"));
ui->pushButton_2->setIcon(QIcon(":/image/plane-fill.png"));
}
Widget::~Widget()
{
delete ui;
}
- ui文件
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>Widget</class>
<widget class="QWidget" name="Widget">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>800</width>
<height>600</height>
</rect>
</property>
<property name="windowTitle">
<string>Widget</string>
</property>
<widget class="QPushButton" name="pushButton">
<property name="geometry">
<rect>
<x>50</x>
<y>70</y>
<width>121</width>
<height>101</height>
</rect>
</property>
<property name="text">
<string/>
</property>
</widget>
<widget class="QPushButton" name="pushButton_2">
<property name="geometry">
<rect>
<x>270</x>
<y>70</y>
<width>80</width>
<height>111</height>
</rect>
</property>
<property name="text">
<string/>
</property>
</widget>
</widget>
<resources/>
<connections/>
</ui>
运行结果:
总结
对文件的引有两种方式,一是使用qrc文件,对于资源文件较小可以方便使用,二是如果资源文件过大,可以采用rcc外部应用文件进行访问。
注意:rcc资源文件路径格式的问题
打开rcc文件路径时,出现了错误提示incomplete universal character name…(通用字符的不完整)
查了资料,在写文件路径的时候,一般是单独“/”或者是“\”,计算机无法完整的理解。文章来源:https://www.toymoban.com/news/detail-611784.html
解决如下
在该路径下的单斜杠转换成双斜杠(“//”或者“\”)都是可以的。文章来源地址https://www.toymoban.com/news/detail-611784.html
到了这里,关于2.3QT资源文件的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!