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