0.前言
对于简单的应用,我们可以直接读取 QSS 样式表文件来实现换肤。但一般样式里还带有图片等资源的路径,如果通过相对路径来加载,不便于管理,不过好处是替换图片方便。我们也可以使用 Qt 的 rcc.exe 工具将资源文件生成为二进制文件,在程序中使用 QResource 进行动态加载。
1.正文Qt 资源系统是一种与平台无关的机制,用于在应用程序的可执行文件中存储二进制文件。如果你的应用程序始终需要一组特定的文件(图标,翻译文件等),这将很有用。
手动修改 qrc 的 xml 文件我感觉有点麻烦,还不如单独建个工程来管理不同皮肤的 qrc ,然后使用 rcc 生成为二进制资源文件(Win 下用 QtCreator 编译器对应的 Cmd,可以切换到 qrc 目录执行,rcc 还提供压缩功能详情见文档):
rcc -binary myresource.qrc -o myresource.rcc
然后在程序中调用静态函数动态加载:
QResource::registerResource("/path/to/myresource.rcc");
参考 Qt 文档(QResource ):https://doc.qt.io/qt-5/qresource.html
参考 Qt 文档(Qt 资源系统):https://doc.qt.io/qt-5/resources.html
2.实现实现效果:
代码链接:
github 链接:https://github.com/gongjianbo/MyTestCode/tree/master/Qt/QtSwitchSkin
主要代码(样式表和图片在资源文件中):
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
void loadSkin(const QString &paths);
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include
#include
#include
#include
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
//为什么不用combobox?因为按钮样式更简单
//可以在启动时读取目录下皮肤文件作为combobox的选项
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()
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?