Qt动态加载资源

一、痛点分析

Qt添加资源(图片资源或qss资源),需要先新建一个Qt资源文件,然后往资源文件中添加资源,之后就可以直接在程序中使用了。
但是如果资源一旦需要更换(例如客户要求修改图标),就必须重新把资源添加到资源文件中,修改代码,然后重新编译,才能实现更新。
这样是很麻烦的,所以这是一个需要解决的问题,可以采取动态加载资源的方式来解决这个问题:将资源文件生成为二进制文件,然后在程序开始的时候加载资源,在程序中就可以直接使用资源了,和常规的使用资源方式是一样的。要是需要修改资源文件,只需要重新生成一下二进制文件,然后更换一下就可以了,不需要二次编译

二、具体操作步骤

1、新建Qt资源文件

在这里插入图片描述
在这里插入图片描述

2、创建images文件夹和qss文件夹

在这里插入图片描述

3、将图片资源和qss资源分别整理到images和qss文件夹中

在这里插入图片描述
在这里插入图片描述

4、用QtCreator打开资源文件Dynamic_photo.qrc

在这里插入图片描述

将图片资源和qss资源加入到Dynamic_photo.qrc:

在这里插入图片描述

5、打开Qt命令行

在这里插入图片描述

6、切换到Dynamic_photo.qrc文件所在路径,并执行下面的代码:

rcc --binary Dynamic_photo.qrc -o skin.rcc

在这里插入图片描述

然后就会生成一个skin.rcc二进制文件:

在这里插入图片描述

7、在可执行文件路径(debug)下新建skin文件夹,将skin.rcc文件复制到skin文件夹中

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

8、在程序中加载资源文件

#include "widget.h"
#include <QApplication>
#include <QResource>
#include <QFile>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QResource::registerResource(qApp->applicationDirPath() + "/skin/skin.rcc");
    QFile file(":/qss/QSS");
    if(file.open(QFile::ReadOnly))
    {
        QString strStyleSheet = file.readAll();
        file.close();
        qApp->setStyleSheet(strStyleSheet);
    }

    Widget w;
    w.show();
    return a.exec();
}

9、使用资源

#include "widget.h"
#include "ui_widget.h"

#include <QResource>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    ui->toolButton->setStyleSheet("background-image: url(:icon/images/file.png);");

}

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

10、效果如下:

在这里插入图片描述

三、动态加载资源实现更换皮肤

#include "mainwindow.h"
#include "ui_mainwindow.h"
 
#include <QResource>
#include <QFile>
#include <QApplication>
#include <QDebug>
 
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
 
    connect(ui->btnWhite,&QPushButton::clicked,this,[=](){
        loadSkin("white.rcc");
    });
    connect(ui->btnBlack,&QPushButton::clicked,this,[=](){
        loadSkin("black.rcc");
    });
    //加载默认样式
    loadSkin("white.rcc");
}
 
MainWindow::~MainWindow()
{
    delete ui;
}
 
void MainWindow::loadSkin(const QString &paths)
{
    static QString old_paths;
    if(paths.isEmpty()||paths==old_paths)
        return;
 
    //先卸载当前的资源
    if(!old_paths.isEmpty()){
        const bool unresult=QResource::unregisterResource(old_paths);
        qDebug()<<"QResource::unregisterResource"<<unresult;
    }
    old_paths=paths;
 
    //加载资源文件
    const bool result=QResource::registerResource(paths);
    qDebug()<<"QResource::registerResource"<<result;
    if(result){
        //设置样式表
        QFile file(":/style.qss");
        if(file.open(QIODevice::ReadOnly)){
            const QString qss_str=file.readAll();
            qApp->setStyleSheet(qss_str);
        }
    }
}

  • 4
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

贝勒里恩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值