feat:DataManager添加本地数据模拟模块
This commit is contained in:
parent
a39e745617
commit
59faca3046
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
//处理关联图形的策略
|
||||
|
|
|
|||
|
|
@ -5,6 +5,7 @@
|
|||
#include <QHash>
|
||||
#include <QQueue>
|
||||
#include <QVariant>
|
||||
#include <QPointer>
|
||||
#include <QTimer>
|
||||
#include <QDateTime>
|
||||
#include <QMutexLocker>
|
||||
|
|
@ -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<QObject> requester;
|
||||
};
|
||||
|
||||
explicit DataManager();
|
||||
|
|
|
|||
|
|
@ -33,7 +33,7 @@ void DataManager::triggerDataUpdate(const QString& dataKey)
|
|||
m_httpManager->requestData(dataKey);
|
||||
else
|
||||
{
|
||||
QThreadPool::globalInstance()->start([weakThis = QPointer<DataManager>(this), dataKey]() {
|
||||
QThreadPool::globalInstance()->start([weakThis = QPointer<DataManager>(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<QString, QSet<QObject*>> groupedRequests;
|
||||
for(const auto& req : requests)
|
||||
{
|
||||
if(req.requester.isNull())
|
||||
continue;
|
||||
groupedRequests[req.dataKey].insert(req.requester);
|
||||
}
|
||||
|
||||
QSet<QString> 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);
|
||||
|
|
|
|||
|
|
@ -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"点状图"));
|
||||
|
|
|
|||
|
|
@ -170,11 +170,6 @@ background-color:rgb(67,160,249);
|
|||
<property name="focusPolicy">
|
||||
<enum>Qt::FocusPolicy::NoFocus</enum>
|
||||
</property>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>折线图</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>曲线图</string>
|
||||
|
|
|
|||
Loading…
Reference in New Issue