2.3QT资源文件

这篇具有很好参考价值的文章主要介绍了2.3QT资源文件。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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)鼠标选中工程左边的项目视图文件夹,单击鼠标右键添加新的文件。

注意
只要是该项目的文件夹,任意点击任何一个都是可以的。

qt资源文件,QT,嵌入式学习,C++,qt,开发语言,ui
3)选择QT资源文件
qt资源文件,QT,嵌入式学习,C++,qt,开发语言,ui

4)设置资源文件的名称和存放路径
qt资源文件,QT,嵌入式学习,C++,qt,开发语言,ui
5) 将资源文件添加到当前的项目中
添加成功后,项目中会自动生成一个Resources的文件
qt资源文件,QT,嵌入式学习,C++,qt,开发语言,ui
qt资源文件,QT,嵌入式学习,C++,qt,开发语言,ui

  1. 向资源文件中添加需要内嵌到程序的文件

qt资源文件,QT,嵌入式学习,C++,qt,开发语言,ui
如图所示:
qt资源文件,QT,嵌入式学习,C++,qt,开发语言,ui
7)资源文件管理器
鼠标选中 qrc 资源文件,右键->open with–>选择打开资源文件的方式。资源管理器可以修改资源文件的访问路径和别名(程序内部使用的名称)。

qt资源文件,QT,嵌入式学习,C++,qt,开发语言,ui

之前我们的文件路径是/,现在我们改成w,点击保存

qt资源文件,QT,嵌入式学习,C++,qt,开发语言,ui

更改后如图所示:
qt资源文件,QT,嵌入式学习,C++,qt,开发语言,ui
我们也可以给资源文件取别名:

之前的文件名称是2.png。现在我们改成two.png

qt资源文件,QT,嵌入式学习,C++,qt,开发语言,ui

  1. 查看资源文件在程序中的访问路径。
    选中一个资源文件,鼠标单击右键可以看到两种访问的方法。鼠标左键单击即可复制到裁剪板。

qt资源文件,QT,嵌入式学习,C++,qt,开发语言,ui

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,然后再选择要添加的背景图片
qt资源文件,QT,嵌入式学习,C++,qt,开发语言,ui

qt资源文件,QT,嵌入式学习,C++,qt,开发语言,ui
方式二:
点击按钮控件找到右下角的属性中的icon
qt资源文件,QT,嵌入式学习,C++,qt,开发语言,ui
2)通过代码方式设置按钮图标

 ui->pushButton->setIcon(QIcon(":/image/open-source-line.png"));
    ui->pushButton_2->setIcon(QIcon(":/image/plane-fill.png"));

效果图:
(按钮上的文字可以在ui界面上删除)
qt资源文件,QT,嵌入式学习,C++,qt,开发语言,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---->点击编辑

qt资源文件,QT,嵌入式学习,C++,qt,开发语言,ui

qt资源文件,QT,嵌入式学习,C++,qt,开发语言,ui

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>

qt资源文件,QT,嵌入式学习,C++,qt,开发语言,ui

2.编译资源文件

在该项目路径下,输入cmd打开命名行窗口

输入以下命令:

rcc -binary ex_resources.qrc -o ex_resources.rcc

编译成功后,rcc会把ex_resources.qrc里面描述的所有图片,视频等文件进行打包压缩生成一个二进制的ex_resources.rcc文件,这个二进制文件中就包含了所有的资源。

qt资源文件,QT,嵌入式学习,C++,qt,开发语言,ui
qt资源文件,QT,嵌入式学习,C++,qt,开发语言,ui

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>

运行结果:
qt资源文件,QT,嵌入式学习,C++,qt,开发语言,ui

总结

对文件的引有两种方式,一是使用qrc文件,对于资源文件较小可以方便使用,二是如果资源文件过大,可以采用rcc外部应用文件进行访问。

注意:rcc资源文件路径格式的问题

打开rcc文件路径时,出现了错误提示incomplete universal character name…(通用字符的不完整)

查了资料,在写文件路径的时候,一般是单独“/”或者是“\”,计算机无法完整的理解。

解决如下
在该路径下的单斜杠转换成双斜杠(“//”或者“\”)都是可以的。文章来源地址https://www.toymoban.com/news/detail-611784.html

到了这里,关于2.3QT资源文件的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【嵌入式Qt开发入门】如何使用Qt进行文本读写——QFile读写文本

            在很多时候我们需要读写文本文件进行读写,比如写个 Mp3 音乐播放器需要读 Mp3 歌词里的文本,比如修改了一个 txt 文件后保存,就需要对这个文件进行读写操作。本文介绍简单的文本文件读写,内容精简,让大家了解文本读写的基本操作。         QFile 类提

    2024年02月12日
    浏览(45)
  • 【嵌入式Qt开发入门】如何使用Qt进行绘制实时图表——QChart 图表

            要想使用 Qt Charts,我们的 Qt 版本得使用 Qt 5.7 之后的版本。其实 Qt Charts 并不是 Qt 5.7 才有的,是在 Qt 5.7 以前只有商业版本的 Qt 才有 Qt Charts。我们能免费下载的 Qt 版本都是社区(开源)版本。         Qt Charts 很方便的绘制我们常见的曲线图、折线图、柱状

    2024年02月12日
    浏览(65)
  • 嵌入式Linux Qt5 (C++)开发栏目概述

    本栏目开始介绍Linux系统下的Qt C++程序开发,资源是以嵌入式为切入点(现在Linux系统下的Qt C++程序开发好像就是应用于嵌入式),那就跟着一起学习 Linux系统下的Qt C++程序开发知识 ,再扩展一下 嵌入式 的知识吧。我这里默认已经 熟悉C++基本语法、熟悉Qt在windows下的使用方

    2024年02月12日
    浏览(46)
  • 【嵌入式Qt开发入门】在Ubuntu下编写C++

            在 Ubuntu 上面编写 C++,本文内容主要介绍在 Ubuntu 在终端窗口下使用 vi/vim 编辑一 个 C++源文件。通过编写最简单的示例“Hello,World!”。带领大家学习如何在 Ubuntu 终端下编辑和编译 C++。这里要求大家会在 Ubuntu 上使用 vi/vim,也就是要求大家有一点 Ubuntu 入门的基

    2024年02月11日
    浏览(47)
  • 嵌入式学习-C++Day7&&QT Day1

    2024年02月21日
    浏览(75)
  • 音视频开发:Qt在视频剪辑3D桌面软件获胜, 嵌入式不敌安卓

    1 Qt Android嵌入式应用层开发方向对比   大家都知道啊,做嵌入式linux设备,一些没有屏幕,比如安防摄像头,门铃之类的,另外一些嵌入式设备是有触控屏,在触控屏上还跑应用软件的,这种比如商场各种自动售卖机,铁路卖票,银行自助服务,车载系统等。 10年前,我大学

    2024年02月09日
    浏览(46)
  • 嵌入式Qt 第一个Qt项目

    打开Qt Creator 界面选择 New Project或者选择菜单栏 【文件】-【新建文件或项目】菜单项   弹出New Project对话框,选择Qt Widgets Application 选择【Choose】按钮,弹出如下对话框 设置项目名称和路径,按照向导进行下一步   选择编译套件 向导会默认添加一个继承自QMainWindow的类,可

    2024年02月20日
    浏览(49)
  • 嵌入式QT (Qt 信号与槽)

    因为有了信号与槽的编程机制,在 Qt 中处理界面各个组件的交互操作时变得更加直观和简单。 信号 (Signal)就是在特定情况下被发射的事件。 GUI 程序设计的主要内容就是对界面上各组件的信号的响应,只需要知道什么情况下发射哪些信号,合理地去响应和处理这些信号就

    2024年02月02日
    浏览(51)
  • 嵌入式QT- QT使用MQTT

    目录 一、MQTT介绍 二、MQTT概念   2.1 订阅(Subscribtion)   2.2 会话(Session)   2.3 主题名(Topic Name)    2.4 主题筛选器(Topic Filter)    2.5 消息订阅 三、MQTT中的角色 3.1 客户端 3.2 服务器 四、X86平台安装mosquitto 4.1 下载 mosquitto 服务器 4.2 下载 mosquitto 客户端 4.3 mosquitto 命令

    2024年02月13日
    浏览(49)
  • 嵌入式Qt Qt中的信号处理

    Qt消息模型: - Qt封装了具体操作系统的消息机制 - Qt遵循经典的GUI消息驱动事件模型 Qt中定义了与系统消息相关的概念;   Qt中的消息处理机制: Qt的核心 QObject::cinnect函数: Qt中的“新”: 实验1 初探信号与槽   运行结果: - 只有QObject的子类才能自定义槽 - 定义槽的

    2024年02月22日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包