lhstylemanager.cpp 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. #include "lhstylemanager.h"
  2. #include <QCoreApplication>
  3. #include <QStyle>
  4. #include <QDir>
  5. #include <QDebug>
  6. LHStyleManager* LHStyleManager::m_instance = nullptr;
  7. QMutex LHStyleManager::m_mtx;
  8. LHStyleManager::LHStyleManager(QObject *parent) : QObject(parent), m_bQss(true)
  9. {
  10. m_nCurStyle = eBrightStyle;
  11. #ifdef QT_NO_DEBUG
  12. QssToSkin();
  13. #endif
  14. }
  15. LHStyleManager::~LHStyleManager()
  16. {
  17. if(m_instance) {
  18. delete m_instance;
  19. }
  20. }
  21. LHStyleManager *LHStyleManager::Instance()
  22. {
  23. if (nullptr == m_instance) {
  24. QMutexLocker lock(&m_mtx);
  25. if (nullptr == m_instance) {
  26. m_instance = new LHStyleManager;
  27. }
  28. }
  29. return m_instance;
  30. }
  31. /**
  32. * @brief 有个隐患:如果widget在外面已经销毁,此处不会消除,导致List越来越大
  33. * @param widget
  34. */
  35. void LHStyleManager::AddWidget(QWidget *widget)
  36. {
  37. if(widget != nullptr && !m_widgetList.contains(widget)) {
  38. m_widgetList.append(widget);
  39. UpdateWidgetStyle(widget);
  40. } else {
  41. UpdateWidgetStyle(widget);
  42. }
  43. }
  44. bool LHStyleManager::UpdateWidgetStyle(QWidget *widget)
  45. {
  46. if(widget == nullptr) {
  47. return false;
  48. }
  49. QString strBasePath = QCoreApplication::applicationDirPath();
  50. QString strStylePath;
  51. QString strName = widget->objectName();
  52. if(m_nCurStyle == eBrightStyle) {
  53. strStylePath = "skin/Bright";
  54. } else if(m_nCurStyle == eDarkStyle) {
  55. strStylePath = "skin/Dark";
  56. }
  57. // 从文件加载样式
  58. QString strStyleFile = strBasePath + QString("/%1/%2.%3").arg(strStylePath, strName, m_bQss ? "qss" : "skin");
  59. //qInfo() << strStyleFile;
  60. // 从资源加载样式,缺点每次需要重新编译才生效
  61. //QString strStyleFile = QString(":/%1/%2.qss").arg(strStylePath).arg(strName);
  62. QFile file(strStyleFile);
  63. if (file.open(QIODevice::ReadOnly)) {
  64. QByteArray arrStyle = file.readAll();
  65. widget->setStyleSheet(m_bQss ? arrStyle : qUncompress(arrStyle));
  66. file.close();
  67. return true;
  68. }
  69. return false;
  70. }
  71. void LHStyleManager::QssToSkin(bool reserve)
  72. {
  73. // 遍历skin文件夹,存在qss就压缩成skin文件,并删除qss文件
  74. QString skinPath(QString("%1/skin/%2/").arg(QCoreApplication::applicationDirPath(), GetCurSkinName()));
  75. QDir directory(skinPath);
  76. if (!directory.exists()) {
  77. //qWarning("目录不存在: %s", qPrintable(skinPath));
  78. return;
  79. }
  80. QStringList filters;
  81. if (!reserve) {
  82. filters << "*.qss";
  83. } else {
  84. filters << "*.shin";
  85. }
  86. QStringList fileNames = directory.entryList(filters, QDir::Files);
  87. for (const QString& fileName : fileNames) {
  88. QString filePath = directory.absoluteFilePath(fileName);
  89. QFile qssFile(filePath);
  90. if (!qssFile.open(QIODevice::ReadOnly)) {
  91. //qWarning("打开Qss文件失败: %s", qPrintable(filePath));
  92. continue;
  93. }
  94. QString skinFilePath = filePath;
  95. if (!reserve) {
  96. skinFilePath.replace(".qss", ".skin");
  97. } else {
  98. skinFilePath.replace(".skin", ".qss");
  99. }
  100. QFile skinFile(skinFilePath);
  101. if (!skinFile.open(QIODevice::WriteOnly)) {
  102. //qWarning("创建文件失败: %s", qPrintable(skinFilePath));
  103. qssFile.close();
  104. continue;
  105. }
  106. QByteArray strQss = qssFile.readAll();
  107. skinFile.write(reserve ? qUncompress(strQss) : qCompress(strQss));
  108. qssFile.close();
  109. skinFile.close();
  110. if (!QFile::remove(filePath)) {
  111. //qWarning("移除文件失败: %s", qPrintable(filePath));
  112. }
  113. }
  114. m_bQss = reserve;
  115. }
  116. void LHStyleManager::SetSkinStyle(const QString& style)
  117. {
  118. if (style.isEmpty()) return;
  119. SkinStyle skin{SkinStyle::eBrightStyle};
  120. if (!style.compare("Bright")) {
  121. skin = SkinStyle::eBrightStyle;
  122. } else if (!style.compare("Dark")) {
  123. skin = SkinStyle::eDarkStyle;
  124. }
  125. if(m_nCurStyle == skin) {
  126. return;
  127. }
  128. m_nCurStyle = skin;
  129. for(int i = 0; i < m_widgetList.size(); i++) {
  130. QWidget* widget = m_widgetList.at(i);
  131. if(widget == nullptr) continue;
  132. UpdateWidgetStyle(widget);
  133. }
  134. }