一、痛点分析
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);
}
}
}