Просмотр исходного кода

V1.5.3
1、替换了UI样式管理器

Apple 2 дней назад
Родитель
Сommit
2411453376
2 измененных файлов с 218 добавлено и 174 удалено
  1. 133 101
      common/UIStyle/UIStyleManager.cpp
  2. 85 73
      common/UIStyle/UIStyleManager.h

+ 133 - 101
common/UIStyle/UIStyleManager.cpp

@@ -1,101 +1,133 @@
-#include "UIStyleManager.h"
-
-#include <QFile>
-#include <QEventLoop>
-#include "LHQLogAPI.h"
-
-UIStyleManager::UIStyleManager()
-{
-    m_qssPath = ":/QSS/QSS";
-}
-
-
-/* 获取样式表路径 */
-QString UIStyleManager::getQSSPath()
-{
-    if(m_UIStyle == enum_UIStyle::UI_Light)
-    {
-        return m_qssPath + m_lightQSS;
-    }
-    else if(m_UIStyle == enum_UIStyle::UI_Dark)
-    {
-        return m_qssPath + m_darkQSS;
-    }
-    return QString();
-}
-
-/* 换肤,修改样式表 */
-void UIStyleManager::setUIStyle(enum_UIStyle style)
-{
-    m_UIStyle = style;
-   
-    /* 打开所有的QSS文件 */
-    readQSSFile();
-
-    /* 发送普通换肤信号信号 */
-    emit signal_qssChanged();
-
-    /* 处理事件,让UI接收到换肤信号 */
-    QEventLoop loop;
-    loop.processEvents();
-
-    LH_WRITE_LOG(QString("换肤成功,皮肤样式:%1").arg((int)m_UIStyle));
-}
-
-/* 读取qss样式文件调用前需要先设置完成样式类型 */
-void UIStyleManager::readQSSFile()
-{
-    QFile file;
-    /* 打开主窗口样式表 */
-    QString qssPath = getQSSPath() + "/transmitterswitch.qss";
-    file.setFileName(qssPath);
-    if(file.open(QIODevice::ReadOnly))
-    {
-        StrQSS_TransmitterSwitch = file.readAll();
-        file.close();
-    }else {
-        LH_WRITE_ERROR(QString("打开样式表失败: %1").arg(qssPath));
-    }
-
-    /* 打开频率按钮的样式表 */
-    qssPath.clear();
-    qssPath = EPUIStyle.getQSSPath() + "/pBtn_frequency.qss";
-    file.setFileName(qssPath);
-    if(file.open(QFile::ReadOnly))
-    {
-        QString qss = file.readAll();
-        StrQSS_PBtnFrequency = qss;
-        file.close();
-    }else {
-        LH_WRITE_ERROR(QString("打开样式表失败: %1").arg(qssPath));
-    }
-
-    /* 打开PlanCard样式 */
-    qssPath.clear();
-    qssPath = EPUIStyle.getQSSPath() + "/plancard.qss";
-    file.setFileName(qssPath);
-    if(file.open(QFile::ReadOnly))
-    {
-        QString qss = file.readAll();
-        StrQSS_PlanCard = qss;
-        file.close();
-    }else {
-        LH_WRITE_ERROR(QString("打开样式表失败: %1").arg(qssPath));
-    }
-
-    /* 打开ManagerPlan样式 */
-    qssPath.clear();
-    qssPath = EPUIStyle.getQSSPath() + "/managerplan.qss";
-    file.setFileName(qssPath);
-    if(file.open(QFile::ReadOnly))
-    {
-        QString qss = file.readAll();
-        StrQSS_ManagerPlan = qss;
-        file.close();
-    }else {
-        LH_WRITE_ERROR(QString("打开样式表失败: %1").arg(qssPath));
-    }
-
-}
-
-
+#include "UIStyleManager.h"
+
+#include <QFile>
+#include <QEventLoop>
+#include <qchar.h>
+#include <qevent.h>
+#include "spdlog/spdlog.h"
+
+UIStyleManager::UIStyleManager()
+{
+    m_qssPath = ":/qss";
+}
+
+
+/* 获取样式表路径 */
+QString UIStyleManager::getQSSPath()
+{
+    if(m_UIStyle == EUIStyle::UI_Light)
+    {
+        return m_qssPath + m_lightQSS;
+    }
+    else if(m_UIStyle == EUIStyle::UI_Dark)
+    {
+        return m_qssPath + m_darkQSS;
+    }
+    return QString();
+}
+
+/* 换肤,修改样式表 */
+void UIStyleManager::setUIStyle(EUIStyle style)
+{
+    m_UIStyle = style;
+   
+    /* 打开所有的QSS文件 */
+    readQSSFile();
+
+    /* 修改已经注册到这里的widget的qss */
+    changeListWidget(style);
+
+    /* 发送普通换肤信号信号 */
+    emit signal_qssChanged(style);
+
+    /* 处理事件,让UI接收到换肤信号 */
+    QEventLoop loop;
+    loop.processEvents();
+
+    SPDLOG_INFO("换肤成功,皮肤样式:{}", static_cast<int>(m_UIStyle));
+}
+
+/* 注册需要修改样式表的组件 */
+void UIStyleManager::registerWidget(QWidget* widget)
+{
+    if(widget == nullptr)
+    {
+        SPDLOG_ERROR("注册组件失败,组件指针为空");
+        return;
+    }
+    if(!m_listWidgets.contains(widget))
+    {
+        m_listWidgets.append(widget);
+        /* 设置样式表 */
+        QString qssPath = getQSSPath() + "/" + widget->objectName().toLower() + ".qss";
+        QFile file(qssPath);
+        if (!file.open(QFile::ReadOnly | QFile::Text))
+        {
+            SPDLOG_ERROR("打开组件样式表文件失败,路径 {}", qssPath.toStdString());
+            SPDLOG_ERROR("错误信息:{}", file.errorString().toStdString());
+            return;
+        }
+        QString styleSheet = file.readAll();
+        file.close();
+        widget->setStyleSheet(styleSheet);
+        // SPDLOG_INFO("注册组件成功,组件名称:{}", widget->objectName().toStdString());
+    } else
+    {
+        SPDLOG_WARN("组件已经注册过了,组件名称:{}", widget->objectName().toStdString());
+    }
+}
+
+/* 注销需要修改样式表的组件 */
+void UIStyleManager::unregisterWidget(QWidget* widget)
+{
+    if(widget == nullptr)
+    {
+        SPDLOG_ERROR("注销组件失败,组件指针为空");
+        return;
+    }
+    if(m_listWidgets.contains(widget))
+    {
+        m_listWidgets.removeAll(widget);
+        // SPDLOG_INFO("注销组件成功,组件名称:{}", widget->objectName().toStdString());
+    } else
+    {
+        SPDLOG_WARN("组件没有注册过,无法注销,组件名称:{}", widget->objectName().toStdString());
+    }
+}
+
+/**
+ * @brief 这里读取需要重复打开的QSS文件
+ * 
+ */
+void UIStyleManager::readQSSFile()
+{
+    
+}
+
+/* 修改已经注册到这里的widget的qss */
+void UIStyleManager::changeListWidget(EUIStyle style)
+{
+    for(QWidget* widget : m_listWidgets)
+    {
+        if(widget == nullptr)
+        {
+            SPDLOG_ERROR("修改组件样式表失败,组件指针为空");
+            continue;
+        }
+        
+        QString qssPath = getQSSPath() + "/" + widget->objectName().toLower() + ".qss";
+        QFile file(qssPath);
+        if (!file.open(QFile::ReadOnly | QFile::Text))
+        {
+            SPDLOG_ERROR("打开组件样式表文件失败,路径:{}", qssPath.toStdString());
+            SPDLOG_ERROR("错误信息:{}", file.errorString().toStdString());
+            continue;
+        }
+        QString styleSheet = file.readAll();
+        file.close();
+        widget->setStyleSheet(styleSheet);
+    }
+    
+}
+
+

+ 85 - 73
common/UIStyle/UIStyleManager.h

@@ -1,73 +1,85 @@
-#ifndef UISTYLEMANAGER_H
-#define UISTYLEMANAGER_H
-
-
-#include <QObject>
-
-
-
-/**
- * @brief UI样式
- * 
- */
- enum class enum_UIStyle
- {
-     UI_Light = 0,               /* 亮色 */
-     UI_Dark = 1                 /* 暗色 */
- };
-
-
-
-#define EPUIStyle UIStyleManager::getInstance()
-/**
- * @brief 全局皮肤管理器,大部分的UI从这里加载qss文件
- * 
- */
-class UIStyleManager : public QObject
-{
-    Q_OBJECT
-
-    UIStyleManager();
-    UIStyleManager(const UIStyleManager& config) = delete;
-    UIStyleManager& operator=(const UIStyleManager& config) = delete;
-public:
-    ~UIStyleManager() {}
-
-    static UIStyleManager& getInstance()
-    {
-        static UIStyleManager config;
-        return config;
-    }
-
-    QString StrQSS_TransmitterSwitch;       /* 主窗口样式表 */
-    QString StrQSS_PBtnFrequency;           /* 频率按钮样式表 */
-    QString StrQSS_PlanCard;                /* 计划卡片样式表 */
-    QString StrQSS_ManagerPlan;             /* 计划管理窗口样式表 */
-
-    /* 获取样式表路径 */
-    QString getQSSPath();
-    /* 换肤,修改样式表 */
-    void setUIStyle(enum_UIStyle style);
-    /* 获取当前UI风格 */
-    enum_UIStyle getUIStyle() { return m_UIStyle; }
-
-signals:
-    /* 样式表改变了 */
-    void signal_qssChanged();
-
-private:
-    /* 读取qss样式文件 */
-    void readQSSFile();
-
-private:
-    enum_UIStyle m_UIStyle;                 /* 当前UI样式 */
-    QString m_qssPath;                      /* 样式表路径 */
-    const QString m_lightQSS = "/white";    /* 亮色样式表路径 */
-    const QString m_darkQSS = "/dark";      /* 暗色样式表路径 */
-
-    
-};
-
-
-
-#endif /* UISTYLEMANAGER_H */
+#ifndef UISTYLEMANAGER_H
+#define UISTYLEMANAGER_H
+
+
+#include <QObject>
+#include <QWidget>
+#include <QList>
+
+
+
+/**
+ * @brief UI样式
+ * 
+ */
+enum class EUIStyle
+{
+    UI_Light = 0,               /* 亮色 */
+    UI_Dark = 1                 /* 暗色 */
+};
+
+/* 将枚举类型注册进Qt系统 */
+Q_DECLARE_METATYPE(EUIStyle)
+
+
+
+#define UIStyle UIStyleManager::getInstance()
+/**
+ * @brief 全局皮肤管理器,大部分的UI从这里加载qss文件
+ *          1、普通的Widget直接在这里打开qss文件,qss文件使用widget的objectbname来获取,qss文件要全小写
+ *          2、普通的widget通过注册过来指针,注册后会自动修改样式表,widget在析构的时候要主动remove掉
+ *          3、如果是高度封装的组件,直接使用信号槽机制来修改样式表
+ * 
+ */
+class UIStyleManager : public QObject
+{
+    Q_OBJECT
+
+    UIStyleManager();
+    UIStyleManager(const UIStyleManager& config) = delete;
+    UIStyleManager& operator=(const UIStyleManager& config) = delete;
+public:
+    ~UIStyleManager() {}
+
+    static UIStyleManager& getInstance()
+    {
+        static UIStyleManager config;
+        return config;
+    }
+
+    /* 获取样式表路径 */
+    QString getQSSPath();
+    /* 换肤,修改样式表 */
+    void setUIStyle(EUIStyle style);
+    /* 获取当前UI风格 */
+    EUIStyle getUIStyle() const { return m_UIStyle; }
+
+    /* 注册需要修改样式表的组件 */
+    void registerWidget(QWidget* widget);
+    /* 注销需要修改样式表的组件 */
+    void unregisterWidget(QWidget* widget);
+    
+
+signals:
+    /* 样式表改变了,这个信号给那些高度封装的组件使用的 */
+    void signal_qssChanged(EUIStyle style);
+
+private:
+    /* 读取qss样式文件 */
+    void readQSSFile();
+    /* 修改已经注册到这里的widget的qss */
+    void changeListWidget(EUIStyle style);
+
+private:
+    EUIStyle m_UIStyle;                             /* 当前UI样式 */
+    QString m_qssPath;                              /* 样式表路径 */
+    const QString m_lightQSS = "/white";            /* 亮色样式表路径 */
+    const QString m_darkQSS = "/dark";              /* 暗色样式表路径 */
+
+    QList<QWidget*> m_listWidgets;                  /* 需要修改样式表的组件列表 */
+    
+};
+
+
+
+#endif /* UISTYLEMANAGER_H */