From 59faca304612c406a57f9730b8b95b3df938ee8c Mon Sep 17 00:00:00 2001 From: duanshengchao <519970194@qq.com> Date: Thu, 21 Aug 2025 17:23:52 +0800 Subject: [PATCH] =?UTF-8?q?feat:DataManager=E6=B7=BB=E5=8A=A0=E6=9C=AC?= =?UTF-8?q?=E5=9C=B0=E6=95=B0=E6=8D=AE=E6=A8=A1=E6=8B=9F=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dataPanel/dpLineChart.cpp | 31 +++++++++++++++++++++++++++++++ dataPanel/dpLineChart.h | 1 + include/dataManager.h | 6 ++++-- source/dataManager.cpp | 12 ++++++++---- source/panelSelectionDialog.cpp | 7 ++----- ui/panelSelectionDialog.ui | 5 ----- 6 files changed, 46 insertions(+), 16 deletions(-) diff --git a/dataPanel/dpLineChart.cpp b/dataPanel/dpLineChart.cpp index 7b67582..1c39729 100644 --- a/dataPanel/dpLineChart.cpp +++ b/dataPanel/dpLineChart.cpp @@ -1,4 +1,5 @@ #include "dpLineChart.h" +#include "dataManager.h" //#define useDefaultAxis_Y //默认轴不可删除、不可左右移动,所以做动态管理尤其是动态排列时要考虑的比较复杂,可以采用不使用的策略,全部以自定义轴替代,默认轴(yAxis)只在初始化和没有实际数据轴(自定义)时显示用来做外观展示 dpLineChart::dpLineChart(QWidget* parent) @@ -18,6 +19,8 @@ dpLineChart::dpLineChart(QWidget* parent) mainLayout->setContentsMargins(0, 1, 0, 0); mainLayout->addWidget(m_pCustomPlot); setLayout(mainLayout); + + connect(DataManager::instance(), &DataManager::dataUpdated, this, &dpLineChart::onSignal_dataUpdated); } dpLineChart::~dpLineChart() @@ -247,6 +250,9 @@ void dpLineChart::setDateTime(const QDateTime& dateTime) } it.value().qGraph->addData(timeValue, randomFloat); } + + // for(auto it = m_graphs.begin(); it != m_graphs.end(); ++it) + // DataManager::instance()->requestData(it.key(), this); } m_pCustomPlot->xAxis->setRange(timeValue, m_timeRange / 1000.0, Qt::AlignRight); @@ -499,3 +505,28 @@ void dpLineChart::onSignal_rangeChanged_xAxis(const QCPRange& range) if(m_timeRange != range.size() * 1000) m_timeRange = range.size() * 1000; } + +void dpLineChart::onSignal_dataUpdated(const QString& dataID, const QVariant& data, const QDateTime& timestamp) +{ + auto it = m_graphs.find(dataID); + if(it != m_graphs.end()) + { + static double marginFactor = 1.0; + double dData = data.toDouble(); + //调整所在轴的范围 + QCPRange range = it.value().qGraph->valueAxis()->range(); + if(dData > range.upper) + { + double upper = dData + marginFactor; + it.value().qGraph->valueAxis()->setRangeUpper(upper); + } + else if(dData < range.lower) + { + double lower = dData - marginFactor; + it.value().qGraph->valueAxis()->setRangeLower(lower); + } + + qint64 timeValue = timestamp.toMSecsSinceEpoch() / 1000.0; + it.value().qGraph->addData(timeValue, dData); + } +} diff --git a/dataPanel/dpLineChart.h b/dataPanel/dpLineChart.h index 1190f9e..59f4a7c 100644 --- a/dataPanel/dpLineChart.h +++ b/dataPanel/dpLineChart.h @@ -31,6 +31,7 @@ public: public slots: void onSignal_rangeChanged_xAxis(const QCPRange&); + void onSignal_dataUpdated(const QString& dataKey, const QVariant& data, const QDateTime& timestamp); private: //处理关联图形的策略 diff --git a/include/dataManager.h b/include/dataManager.h index d81a2af..6042b0b 100644 --- a/include/dataManager.h +++ b/include/dataManager.h @@ -5,6 +5,7 @@ #include #include #include +#include #include #include #include @@ -38,7 +39,7 @@ public: HttpRequestManager* httpManager(); signals: - void dataUpdated(const QString& dataKey, const QVariant& data); + void dataUpdated(const QString& dataKey, const QVariant& data, const QDateTime& timestamp); void cacheInvalidated(const QString& dataKey); public slots: @@ -52,7 +53,8 @@ private: struct RequestInfo { QString dataKey; - QObject* requester; + //QObject* requester; + QPointer requester; }; explicit DataManager(); diff --git a/source/dataManager.cpp b/source/dataManager.cpp index e9a6a60..b0d6a4f 100644 --- a/source/dataManager.cpp +++ b/source/dataManager.cpp @@ -33,7 +33,7 @@ void DataManager::triggerDataUpdate(const QString& dataKey) m_httpManager->requestData(dataKey); else { - QThreadPool::globalInstance()->start([weakThis = QPointer(this), dataKey]() { + QThreadPool::globalInstance()->start([weakThis = QPointer(this), dataKey]() { //多线程中采用QPointer可以防止垂悬指针的问题,此处可以不用,但是建议习惯性的这样写 if(weakThis.isNull()) return; @@ -67,7 +67,7 @@ void DataManager::triggerDataUpdate(const QString& dataKey) { entry.data = newData; entry.timestamp = QDateTime::currentDateTime(); - emit weakThis->dataUpdated(dataKey, newData); + emit weakThis->dataUpdated(dataKey, newData, entry.timestamp); } entry.isUpdating = false; } @@ -166,7 +166,11 @@ void DataManager::processRequestQueue() //按数据类型进行分组,减少更新频率 QMap> groupedRequests; for(const auto& req : requests) + { + if(req.requester.isNull()) + continue; groupedRequests[req.dataKey].insert(req.requester); + } QSet needsUpdate; QDateTime curTime = QDateTime::currentDateTime(); @@ -195,7 +199,7 @@ void DataManager::processRequestQueue() { entry.isUpdating = true; m_pendingUpdates.insert(dataKey); - needsUpdate.insert(dataKey); + needsUpdate.insert(dataKey); //本地数据无需加锁,减少锁范围 } } } //写锁在这里自动释放 @@ -216,7 +220,7 @@ void DataManager::handleHttpDataReceived(const QString& dataKey, const QVariant& entry.timestamp = QDateTime::currentDateTime(); entry.isUpdating = false; - emit dataUpdated(dataKey, data); + emit dataUpdated(dataKey, data, entry.timestamp); } m_pendingUpdates.remove(dataKey); diff --git a/source/panelSelectionDialog.cpp b/source/panelSelectionDialog.cpp index 6aed9f3..12de821 100644 --- a/source/panelSelectionDialog.cpp +++ b/source/panelSelectionDialog.cpp @@ -26,13 +26,10 @@ void PanelSelectionDialog::initList() { ui->listWidget->clear(); - QListWidgetItem* item = new QListWidgetItem(QString::fromWCharArray(L"折线图")); + QListWidgetItem* item = new QListWidgetItem(QString::fromWCharArray(L"曲线图")); item->setData(Qt::UserRole + panelTye, lineChart); ui->listWidget->addItem(item); - item = new QListWidgetItem(QString::fromWCharArray(L"曲线图")); - item->setData(Qt::UserRole + panelTye, curveChart); - ui->listWidget->addItem(item); - item = new QListWidgetItem(QString::fromWCharArray(L"柱状图")); + item = new QListWidgetItem(QString::fromWCharArray(L"直方图")); item->setData(Qt::UserRole + panelTye, barChart); ui->listWidget->addItem(item); item = new QListWidgetItem(QString::fromWCharArray(L"点状图")); diff --git a/ui/panelSelectionDialog.ui b/ui/panelSelectionDialog.ui index bacd793..0de60f9 100644 --- a/ui/panelSelectionDialog.ui +++ b/ui/panelSelectionDialog.ui @@ -170,11 +170,6 @@ background-color:rgb(67,160,249); Qt::FocusPolicy::NoFocus - - - 折线图 - - 曲线图