Qt动态加载资源

一、痛点分析

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

二、具体操作步骤

1、新建Qt资源文件

Qt动态加载资源_第1张图片
Qt动态加载资源_第2张图片

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

Qt动态加载资源_第3张图片

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

Qt动态加载资源_第4张图片
Qt动态加载资源_第5张图片

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

Qt动态加载资源_第6张图片

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

Qt动态加载资源_第7张图片

5、打开Qt命令行

Qt动态加载资源_第8张图片

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

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

在这里插入图片描述

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

Qt动态加载资源_第9张图片

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

Qt动态加载资源_第10张图片
Qt动态加载资源_第11张图片
Qt动态加载资源_第12张图片

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

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

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 

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、效果如下:

Qt动态加载资源_第13张图片

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

#include "mainwindow.h"
#include "ui_mainwindow.h"
 
#include 
#include 
#include 
#include 
 
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);
        }
    }
}

你可能感兴趣的:(QT)