UIStyleManager.cpp 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. #include "UIStyleManager.h"
  2. #include <QFile>
  3. #include <QEventLoop>
  4. #include <qchar.h>
  5. #include <qevent.h>
  6. #include "spdlog/spdlog.h"
  7. UIStyleManager::UIStyleManager()
  8. {
  9. m_qssPath = ":/qss";
  10. }
  11. /* 获取样式表路径 */
  12. QString UIStyleManager::getQSSPath()
  13. {
  14. if(m_UIStyle == EUIStyle::UI_Light)
  15. {
  16. return m_qssPath + m_lightQSS;
  17. }
  18. else if(m_UIStyle == EUIStyle::UI_Dark)
  19. {
  20. return m_qssPath + m_darkQSS;
  21. }
  22. return QString();
  23. }
  24. /* 换肤,修改样式表 */
  25. void UIStyleManager::setUIStyle(EUIStyle style)
  26. {
  27. m_UIStyle = style;
  28. /* 打开所有的QSS文件 */
  29. readQSSFile();
  30. /* 修改已经注册到这里的widget的qss */
  31. changeListWidget(style);
  32. /* 发送普通换肤信号信号 */
  33. emit signal_qssChanged(style);
  34. /* 处理事件,让UI接收到换肤信号 */
  35. QEventLoop loop;
  36. loop.processEvents();
  37. SPDLOG_INFO("换肤成功,皮肤样式:{}", static_cast<int>(m_UIStyle));
  38. }
  39. /* 注册需要修改样式表的组件 */
  40. void UIStyleManager::registerWidget(QWidget* widget)
  41. {
  42. if(widget == nullptr)
  43. {
  44. SPDLOG_ERROR("注册组件失败,组件指针为空");
  45. return;
  46. }
  47. if(!m_listWidgets.contains(widget))
  48. {
  49. m_listWidgets.append(widget);
  50. /* 设置样式表 */
  51. QString qssPath = getQSSPath() + "/" + widget->objectName().toLower() + ".qss";
  52. QFile file(qssPath);
  53. if (!file.open(QFile::ReadOnly | QFile::Text))
  54. {
  55. SPDLOG_ERROR("打开组件样式表文件失败,路径 {}", qssPath.toStdString());
  56. SPDLOG_ERROR("错误信息:{}", file.errorString().toStdString());
  57. return;
  58. }
  59. QString styleSheet = file.readAll();
  60. file.close();
  61. widget->setStyleSheet(styleSheet);
  62. // SPDLOG_INFO("注册组件成功,组件名称:{}", widget->objectName().toStdString());
  63. } else
  64. {
  65. SPDLOG_WARN("组件已经注册过了,组件名称:{}", widget->objectName().toStdString());
  66. }
  67. }
  68. /* 注销需要修改样式表的组件 */
  69. void UIStyleManager::unregisterWidget(QWidget* widget)
  70. {
  71. if(widget == nullptr)
  72. {
  73. SPDLOG_ERROR("注销组件失败,组件指针为空");
  74. return;
  75. }
  76. if(m_listWidgets.contains(widget))
  77. {
  78. m_listWidgets.removeAll(widget);
  79. // SPDLOG_INFO("注销组件成功,组件名称:{}", widget->objectName().toStdString());
  80. } else
  81. {
  82. SPDLOG_WARN("组件没有注册过,无法注销,组件名称:{}", widget->objectName().toStdString());
  83. }
  84. }
  85. /**
  86. * @brief 这里读取需要重复打开的QSS文件
  87. *
  88. */
  89. void UIStyleManager::readQSSFile()
  90. {
  91. }
  92. /* 修改已经注册到这里的widget的qss */
  93. void UIStyleManager::changeListWidget(EUIStyle style)
  94. {
  95. for(QWidget* widget : m_listWidgets)
  96. {
  97. if(widget == nullptr)
  98. {
  99. SPDLOG_ERROR("修改组件样式表失败,组件指针为空");
  100. continue;
  101. }
  102. QString qssPath = getQSSPath() + "/" + widget->objectName().toLower() + ".qss";
  103. QFile file(qssPath);
  104. if (!file.open(QFile::ReadOnly | QFile::Text))
  105. {
  106. SPDLOG_ERROR("打开组件样式表文件失败,路径:{}", qssPath.toStdString());
  107. SPDLOG_ERROR("错误信息:{}", file.errorString().toStdString());
  108. continue;
  109. }
  110. QString styleSheet = file.readAll();
  111. file.close();
  112. widget->setStyleSheet(styleSheet);
  113. }
  114. }