123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150 |
- #include "lhstylemanager.h"
- #include <QCoreApplication>
- #include <QStyle>
- #include <QDir>
- #include <QDebug>
- LHStyleManager* LHStyleManager::m_instance = nullptr;
- QMutex LHStyleManager::m_mtx;
- LHStyleManager::LHStyleManager(QObject *parent) : QObject(parent), m_bQss(true)
- {
- m_nCurStyle = eBrightStyle;
- #ifdef QT_NO_DEBUG
- QssToSkin();
- #endif
- }
- LHStyleManager::~LHStyleManager()
- {
- if(m_instance) {
- delete m_instance;
- }
- }
- LHStyleManager *LHStyleManager::Instance()
- {
- if (nullptr == m_instance) {
- QMutexLocker lock(&m_mtx);
- if (nullptr == m_instance) {
- m_instance = new LHStyleManager;
- }
- }
- return m_instance;
- }
- /**
- * @brief 有个隐患:如果widget在外面已经销毁,此处不会消除,导致List越来越大
- * @param widget
- */
- void LHStyleManager::AddWidget(QWidget *widget)
- {
- if(widget != nullptr && !m_widgetList.contains(widget)) {
- m_widgetList.append(widget);
- UpdateWidgetStyle(widget);
- } else {
- UpdateWidgetStyle(widget);
- }
- }
- bool LHStyleManager::UpdateWidgetStyle(QWidget *widget)
- {
- if(widget == nullptr) {
- return false;
- }
- QString strBasePath = QCoreApplication::applicationDirPath();
- QString strStylePath;
- QString strName = widget->objectName();
- if(m_nCurStyle == eBrightStyle) {
- strStylePath = "skin/Bright";
- } else if(m_nCurStyle == eDarkStyle) {
- strStylePath = "skin/Dark";
- }
- // 从文件加载样式
- QString strStyleFile = strBasePath + QString("/%1/%2.%3").arg(strStylePath, strName, m_bQss ? "qss" : "skin");
- //qInfo() << strStyleFile;
- // 从资源加载样式,缺点每次需要重新编译才生效
- //QString strStyleFile = QString(":/%1/%2.qss").arg(strStylePath).arg(strName);
- QFile file(strStyleFile);
- if (file.open(QIODevice::ReadOnly)) {
- QByteArray arrStyle = file.readAll();
- widget->setStyleSheet(m_bQss ? arrStyle : qUncompress(arrStyle));
- file.close();
- return true;
- }
- return false;
- }
- void LHStyleManager::QssToSkin(bool reserve)
- {
- // 遍历skin文件夹,存在qss就压缩成skin文件,并删除qss文件
- QString skinPath(QString("%1/skin/%2/").arg(QCoreApplication::applicationDirPath(), GetCurSkinName()));
- QDir directory(skinPath);
- if (!directory.exists()) {
- //qWarning("目录不存在: %s", qPrintable(skinPath));
- return;
- }
- QStringList filters;
- if (!reserve) {
- filters << "*.qss";
- } else {
- filters << "*.shin";
- }
- QStringList fileNames = directory.entryList(filters, QDir::Files);
- for (const QString& fileName : fileNames) {
- QString filePath = directory.absoluteFilePath(fileName);
- QFile qssFile(filePath);
- if (!qssFile.open(QIODevice::ReadOnly)) {
- //qWarning("打开Qss文件失败: %s", qPrintable(filePath));
- continue;
- }
- QString skinFilePath = filePath;
- if (!reserve) {
- skinFilePath.replace(".qss", ".skin");
- } else {
- skinFilePath.replace(".skin", ".qss");
- }
- QFile skinFile(skinFilePath);
- if (!skinFile.open(QIODevice::WriteOnly)) {
- //qWarning("创建文件失败: %s", qPrintable(skinFilePath));
- qssFile.close();
- continue;
- }
- QByteArray strQss = qssFile.readAll();
- skinFile.write(reserve ? qUncompress(strQss) : qCompress(strQss));
- qssFile.close();
- skinFile.close();
- if (!QFile::remove(filePath)) {
- //qWarning("移除文件失败: %s", qPrintable(filePath));
- }
- }
- m_bQss = reserve;
- }
- void LHStyleManager::SetSkinStyle(const QString& style)
- {
- if (style.isEmpty()) return;
- SkinStyle skin{SkinStyle::eBrightStyle};
- if (!style.compare("Bright")) {
- skin = SkinStyle::eBrightStyle;
- } else if (!style.compare("Dark")) {
- skin = SkinStyle::eDarkStyle;
- }
- if(m_nCurStyle == skin) {
- return;
- }
- m_nCurStyle = skin;
- for(int i = 0; i < m_widgetList.size(); i++) {
- QWidget* widget = m_widgetList.at(i);
- if(widget == nullptr) continue;
- UpdateWidgetStyle(widget);
- }
- }
|