feat:DataManager添加本地数据模拟模块
This commit is contained in:
parent
a39e745617
commit
59faca3046
|
|
@ -1,4 +1,5 @@
|
||||||
#include "dpLineChart.h"
|
#include "dpLineChart.h"
|
||||||
|
#include "dataManager.h"
|
||||||
|
|
||||||
//#define useDefaultAxis_Y //默认轴不可删除、不可左右移动,所以做动态管理尤其是动态排列时要考虑的比较复杂,可以采用不使用的策略,全部以自定义轴替代,默认轴(yAxis)只在初始化和没有实际数据轴(自定义)时显示用来做外观展示
|
//#define useDefaultAxis_Y //默认轴不可删除、不可左右移动,所以做动态管理尤其是动态排列时要考虑的比较复杂,可以采用不使用的策略,全部以自定义轴替代,默认轴(yAxis)只在初始化和没有实际数据轴(自定义)时显示用来做外观展示
|
||||||
dpLineChart::dpLineChart(QWidget* parent)
|
dpLineChart::dpLineChart(QWidget* parent)
|
||||||
|
|
@ -18,6 +19,8 @@ dpLineChart::dpLineChart(QWidget* parent)
|
||||||
mainLayout->setContentsMargins(0, 1, 0, 0);
|
mainLayout->setContentsMargins(0, 1, 0, 0);
|
||||||
mainLayout->addWidget(m_pCustomPlot);
|
mainLayout->addWidget(m_pCustomPlot);
|
||||||
setLayout(mainLayout);
|
setLayout(mainLayout);
|
||||||
|
|
||||||
|
connect(DataManager::instance(), &DataManager::dataUpdated, this, &dpLineChart::onSignal_dataUpdated);
|
||||||
}
|
}
|
||||||
|
|
||||||
dpLineChart::~dpLineChart()
|
dpLineChart::~dpLineChart()
|
||||||
|
|
@ -247,6 +250,9 @@ void dpLineChart::setDateTime(const QDateTime& dateTime)
|
||||||
}
|
}
|
||||||
it.value().qGraph->addData(timeValue, randomFloat);
|
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);
|
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)
|
if(m_timeRange != range.size() * 1000)
|
||||||
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -31,6 +31,7 @@ public:
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
void onSignal_rangeChanged_xAxis(const QCPRange&);
|
void onSignal_rangeChanged_xAxis(const QCPRange&);
|
||||||
|
void onSignal_dataUpdated(const QString& dataKey, const QVariant& data, const QDateTime& timestamp);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
//处理关联图形的策略
|
//处理关联图形的策略
|
||||||
|
|
|
||||||
|
|
@ -5,6 +5,7 @@
|
||||||
#include <QHash>
|
#include <QHash>
|
||||||
#include <QQueue>
|
#include <QQueue>
|
||||||
#include <QVariant>
|
#include <QVariant>
|
||||||
|
#include <QPointer>
|
||||||
#include <QTimer>
|
#include <QTimer>
|
||||||
#include <QDateTime>
|
#include <QDateTime>
|
||||||
#include <QMutexLocker>
|
#include <QMutexLocker>
|
||||||
|
|
@ -38,7 +39,7 @@ public:
|
||||||
HttpRequestManager* httpManager();
|
HttpRequestManager* httpManager();
|
||||||
|
|
||||||
signals:
|
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);
|
void cacheInvalidated(const QString& dataKey);
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
|
|
@ -52,7 +53,8 @@ private:
|
||||||
struct RequestInfo
|
struct RequestInfo
|
||||||
{
|
{
|
||||||
QString dataKey;
|
QString dataKey;
|
||||||
QObject* requester;
|
//QObject* requester;
|
||||||
|
QPointer<QObject> requester;
|
||||||
};
|
};
|
||||||
|
|
||||||
explicit DataManager();
|
explicit DataManager();
|
||||||
|
|
|
||||||
|
|
@ -33,7 +33,7 @@ void DataManager::triggerDataUpdate(const QString& dataKey)
|
||||||
m_httpManager->requestData(dataKey);
|
m_httpManager->requestData(dataKey);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
QThreadPool::globalInstance()->start([weakThis = QPointer<DataManager>(this), dataKey]() {
|
QThreadPool::globalInstance()->start([weakThis = QPointer<DataManager>(this), dataKey]() { //多线程中采用QPointer可以防止垂悬指针的问题,此处可以不用,但是建议习惯性的这样写
|
||||||
if(weakThis.isNull())
|
if(weakThis.isNull())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|
@ -67,7 +67,7 @@ void DataManager::triggerDataUpdate(const QString& dataKey)
|
||||||
{
|
{
|
||||||
entry.data = newData;
|
entry.data = newData;
|
||||||
entry.timestamp = QDateTime::currentDateTime();
|
entry.timestamp = QDateTime::currentDateTime();
|
||||||
emit weakThis->dataUpdated(dataKey, newData);
|
emit weakThis->dataUpdated(dataKey, newData, entry.timestamp);
|
||||||
}
|
}
|
||||||
entry.isUpdating = false;
|
entry.isUpdating = false;
|
||||||
}
|
}
|
||||||
|
|
@ -166,7 +166,11 @@ void DataManager::processRequestQueue()
|
||||||
//按数据类型进行分组,减少更新频率
|
//按数据类型进行分组,减少更新频率
|
||||||
QMap<QString, QSet<QObject*>> groupedRequests;
|
QMap<QString, QSet<QObject*>> groupedRequests;
|
||||||
for(const auto& req : requests)
|
for(const auto& req : requests)
|
||||||
|
{
|
||||||
|
if(req.requester.isNull())
|
||||||
|
continue;
|
||||||
groupedRequests[req.dataKey].insert(req.requester);
|
groupedRequests[req.dataKey].insert(req.requester);
|
||||||
|
}
|
||||||
|
|
||||||
QSet<QString> needsUpdate;
|
QSet<QString> needsUpdate;
|
||||||
QDateTime curTime = QDateTime::currentDateTime();
|
QDateTime curTime = QDateTime::currentDateTime();
|
||||||
|
|
@ -195,7 +199,7 @@ void DataManager::processRequestQueue()
|
||||||
{
|
{
|
||||||
entry.isUpdating = true;
|
entry.isUpdating = true;
|
||||||
m_pendingUpdates.insert(dataKey);
|
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.timestamp = QDateTime::currentDateTime();
|
||||||
entry.isUpdating = false;
|
entry.isUpdating = false;
|
||||||
|
|
||||||
emit dataUpdated(dataKey, data);
|
emit dataUpdated(dataKey, data, entry.timestamp);
|
||||||
}
|
}
|
||||||
|
|
||||||
m_pendingUpdates.remove(dataKey);
|
m_pendingUpdates.remove(dataKey);
|
||||||
|
|
|
||||||
|
|
@ -26,13 +26,10 @@ void PanelSelectionDialog::initList()
|
||||||
{
|
{
|
||||||
ui->listWidget->clear();
|
ui->listWidget->clear();
|
||||||
|
|
||||||
QListWidgetItem* item = new QListWidgetItem(QString::fromWCharArray(L"折线图"));
|
QListWidgetItem* item = new QListWidgetItem(QString::fromWCharArray(L"曲线图"));
|
||||||
item->setData(Qt::UserRole + panelTye, lineChart);
|
item->setData(Qt::UserRole + panelTye, lineChart);
|
||||||
ui->listWidget->addItem(item);
|
ui->listWidget->addItem(item);
|
||||||
item = new QListWidgetItem(QString::fromWCharArray(L"曲线图"));
|
item = new QListWidgetItem(QString::fromWCharArray(L"直方图"));
|
||||||
item->setData(Qt::UserRole + panelTye, curveChart);
|
|
||||||
ui->listWidget->addItem(item);
|
|
||||||
item = new QListWidgetItem(QString::fromWCharArray(L"柱状图"));
|
|
||||||
item->setData(Qt::UserRole + panelTye, barChart);
|
item->setData(Qt::UserRole + panelTye, barChart);
|
||||||
ui->listWidget->addItem(item);
|
ui->listWidget->addItem(item);
|
||||||
item = new QListWidgetItem(QString::fromWCharArray(L"点状图"));
|
item = new QListWidgetItem(QString::fromWCharArray(L"点状图"));
|
||||||
|
|
|
||||||
|
|
@ -170,11 +170,6 @@ background-color:rgb(67,160,249);
|
||||||
<property name="focusPolicy">
|
<property name="focusPolicy">
|
||||||
<enum>Qt::FocusPolicy::NoFocus</enum>
|
<enum>Qt::FocusPolicy::NoFocus</enum>
|
||||||
</property>
|
</property>
|
||||||
<item>
|
|
||||||
<property name="text">
|
|
||||||
<string>折线图</string>
|
|
||||||
</property>
|
|
||||||
</item>
|
|
||||||
<item>
|
<item>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>曲线图</string>
|
<string>曲线图</string>
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue