|
|
@@ -0,0 +1,162 @@
|
|
|
+#include "statswidget.h"
|
|
|
+#include <QDebug>
|
|
|
+
|
|
|
+StatsWidget::StatsWidget(QWidget *parent)
|
|
|
+ : QWidget(parent)
|
|
|
+ , m_statsGroup(nullptr)
|
|
|
+ , m_totalCountLabel(nullptr)
|
|
|
+ , m_type0CountLabel(nullptr)
|
|
|
+ , m_type1CountLabel(nullptr)
|
|
|
+ , m_type2CountLabel(nullptr)
|
|
|
+ , m_lastUpdateLabel(nullptr)
|
|
|
+ , m_totalCount(0)
|
|
|
+ , m_type0Count(0)
|
|
|
+ , m_type1Count(0)
|
|
|
+ , m_type2Count(0)
|
|
|
+{
|
|
|
+ setupUI();
|
|
|
+ applyStyles();
|
|
|
+}
|
|
|
+
|
|
|
+StatsWidget::~StatsWidget()
|
|
|
+{
|
|
|
+}
|
|
|
+
|
|
|
+void StatsWidget::setupUI()
|
|
|
+{
|
|
|
+ // 创建主布局
|
|
|
+ QVBoxLayout *mainLayout = new QVBoxLayout(this);
|
|
|
+ mainLayout->setContentsMargins(5, 5, 5, 5);
|
|
|
+ mainLayout->setSpacing(5);
|
|
|
+
|
|
|
+ // 创建统计信息组
|
|
|
+ m_statsGroup = new QGroupBox("消息统计", this);
|
|
|
+ QVBoxLayout *statsLayout = new QVBoxLayout(m_statsGroup);
|
|
|
+ statsLayout->setContentsMargins(10, 10, 10, 10);
|
|
|
+ statsLayout->setSpacing(8);
|
|
|
+
|
|
|
+ // 总消息数
|
|
|
+ m_totalCountLabel = new QLabel("总消息数: 0", this);
|
|
|
+ m_totalCountLabel->setObjectName("totalCountLabel");
|
|
|
+ statsLayout->addWidget(m_totalCountLabel);
|
|
|
+
|
|
|
+ // 创建消息类型统计的水平布局
|
|
|
+ QHBoxLayout *typeLayout = new QHBoxLayout();
|
|
|
+ typeLayout->setSpacing(15);
|
|
|
+
|
|
|
+ // 类型0消息数
|
|
|
+ m_type0CountLabel = new QLabel("类型0: 0", this);
|
|
|
+ m_type0CountLabel->setObjectName("type0CountLabel");
|
|
|
+ typeLayout->addWidget(m_type0CountLabel);
|
|
|
+
|
|
|
+ // 类型1消息数
|
|
|
+ m_type1CountLabel = new QLabel("类型1: 0", this);
|
|
|
+ m_type1CountLabel->setObjectName("type1CountLabel");
|
|
|
+ typeLayout->addWidget(m_type1CountLabel);
|
|
|
+
|
|
|
+ // 类型2消息数
|
|
|
+ m_type2CountLabel = new QLabel("类型2: 0", this);
|
|
|
+ m_type2CountLabel->setObjectName("type2CountLabel");
|
|
|
+ typeLayout->addWidget(m_type2CountLabel);
|
|
|
+
|
|
|
+ statsLayout->addLayout(typeLayout);
|
|
|
+
|
|
|
+ // 最后更新时间
|
|
|
+ m_lastUpdateLabel = new QLabel("最后更新: --", this);
|
|
|
+ m_lastUpdateLabel->setObjectName("lastUpdateLabel");
|
|
|
+ statsLayout->addWidget(m_lastUpdateLabel);
|
|
|
+
|
|
|
+ // 添加到主布局
|
|
|
+ mainLayout->addWidget(m_statsGroup);
|
|
|
+ mainLayout->addStretch();
|
|
|
+
|
|
|
+ setLayout(mainLayout);
|
|
|
+ setMaximumHeight(150);
|
|
|
+}
|
|
|
+
|
|
|
+void StatsWidget::applyStyles()
|
|
|
+{
|
|
|
+ setStyleSheet(
|
|
|
+ "QGroupBox {"
|
|
|
+ " font-weight: bold;"
|
|
|
+ " border: 2px solid #cccccc;"
|
|
|
+ " border-radius: 5px;"
|
|
|
+ " margin-top: 1ex;"
|
|
|
+ " padding-top: 5px;"
|
|
|
+ "}"
|
|
|
+ "QGroupBox::title {"
|
|
|
+ " subcontrol-origin: margin;"
|
|
|
+ " left: 10px;"
|
|
|
+ " padding: 0 5px 0 5px;"
|
|
|
+ "}"
|
|
|
+ "#totalCountLabel {"
|
|
|
+ " font-weight: bold;"
|
|
|
+ " color: #2c3e50;"
|
|
|
+ " font-size: 14px;"
|
|
|
+ "}"
|
|
|
+ "#type0CountLabel, #type1CountLabel, #type2CountLabel {"
|
|
|
+ " color: #34495e;"
|
|
|
+ " font-size: 12px;"
|
|
|
+ "}"
|
|
|
+ "#lastUpdateLabel {"
|
|
|
+ " color: #7f8c8d;"
|
|
|
+ " font-size: 11px;"
|
|
|
+ "}"
|
|
|
+ );
|
|
|
+}
|
|
|
+
|
|
|
+void StatsWidget::updateStats(const QJsonObject& statsData)
|
|
|
+{
|
|
|
+ qDebug() << "[StatsWidget] 收到统计更新:" << statsData;
|
|
|
+
|
|
|
+ // 解析data数组并累加所有用户的统计数据
|
|
|
+ if (statsData.contains("data") && statsData["data"].isArray()) {
|
|
|
+ QJsonArray dataArray = statsData["data"].toArray();
|
|
|
+
|
|
|
+ // 重置累计数据
|
|
|
+ m_totalCount = 0;
|
|
|
+ m_type0Count = 0;
|
|
|
+ m_type1Count = 0;
|
|
|
+ m_type2Count = 0;
|
|
|
+ QDateTime latestUpdate;
|
|
|
+
|
|
|
+ // 遍历所有用户数据进行累加
|
|
|
+ for (const QJsonValue& value : dataArray) {
|
|
|
+ if (value.isObject()) {
|
|
|
+ QJsonObject userStats = value.toObject();
|
|
|
+
|
|
|
+ // 累加各类型消息数
|
|
|
+ m_totalCount += userStats["totalCount"].toInt();
|
|
|
+ m_type0Count += userStats["type0Count"].toInt();
|
|
|
+ m_type1Count += userStats["type1Count"].toInt();
|
|
|
+ m_type2Count += userStats["type2Count"].toInt();
|
|
|
+
|
|
|
+ // 找到最新的更新时间
|
|
|
+ QString lastUpdateStr = userStats["lastUpdate"].toString();
|
|
|
+ QDateTime userUpdate = QDateTime::fromString(lastUpdateStr, Qt::ISODate);
|
|
|
+ if (userUpdate.isValid() && (!latestUpdate.isValid() || userUpdate > latestUpdate)) {
|
|
|
+ latestUpdate = userUpdate;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ m_lastUpdate = latestUpdate;
|
|
|
+
|
|
|
+ // 更新UI显示
|
|
|
+ m_totalCountLabel->setText(QString("总消息数: %1").arg(m_totalCount));
|
|
|
+ m_type0CountLabel->setText(QString("类型0: %1").arg(m_type0Count));
|
|
|
+ m_type1CountLabel->setText(QString("类型1: %1").arg(m_type1Count));
|
|
|
+ m_type2CountLabel->setText(QString("类型2: %1").arg(m_type2Count));
|
|
|
+
|
|
|
+ if (m_lastUpdate.isValid()) {
|
|
|
+ m_lastUpdateLabel->setText(QString("最后更新: %1")
|
|
|
+ .arg(m_lastUpdate.toString("yyyy-MM-dd hh:mm:ss")));
|
|
|
+ } else {
|
|
|
+ m_lastUpdateLabel->setText("最后更新: --");
|
|
|
+ }
|
|
|
+
|
|
|
+ qDebug() << "[StatsWidget] 全局统计信息已更新 - 总数:" << m_totalCount
|
|
|
+ << "类型0:" << m_type0Count << "类型1:" << m_type1Count
|
|
|
+ << "类型2:" << m_type2Count << "用户数:" << dataArray.size();
|
|
|
+ }
|
|
|
+}
|