DataRealTimeDisplay/realTimeDataDisplay/realTimeDataDisplay.cpp

138 lines
4.4 KiB
C++
Raw Normal View History

2023-01-16 15:10:44 +08:00
#include "realTimeDataDisplay.h"
realTimeDataDisplay::realTimeDataDisplay(QWidget* parent)
: QMainWindow(parent)
{
ui.setupUi(this);
mPlot = new QCustomPlot(this);
setCentralWidget(mPlot);
//mPlot->yAxis->setTickLabels(false);
mPlot->axisRect()->axis(QCPAxis::atRight, 0)->setPadding(54);
mGraph1 = mPlot->addGraph(mPlot->xAxis, mPlot->axisRect()->axis(QCPAxis::atRight, 0));
QColor color1(100, 140, 180);
QPen pen;
pen.setStyle(Qt::PenStyle::SolidLine);
pen.setColor(color1);
mGraph1->setPen(pen);
color1.setAlpha(100);
mPlot->graph(0)->setBrush(QBrush(color1));
mPlot->graph(0)->setName("sin(t)+sin(t/0.38)");
mGraph2 = mPlot->addGraph(mPlot->xAxis, mPlot->axisRect()->axis(QCPAxis::atRight, 0));
QColor color2(166, 77, 157);
pen.setStyle(Qt::PenStyle::SolidLine);
pen.setColor(color2);
mGraph2->setPen(pen);
color2.setAlpha(100);
mPlot->graph(1)->setBrush(QBrush(color2));
mPlot->graph(1)->setName("sin(t)");
QSharedPointer<QCPAxisTickerTime> timeTicker(new QCPAxisTickerTime);
timeTicker->setTimeFormat("%h:%m:%s");
mPlot->xAxis->setTicker(timeTicker);
mPlot->xAxis->setRange(0, 16);
mPlot->yAxis->setRange(-2.2, 2.2);
mPlot->xAxis->setLabel("time");
mPlot->yAxis->setLabel("value");
mPlot->plotLayout()->insertRow(0);
QCPTextElement* title = new QCPTextElement(mPlot, "Realtime Data Display");
mPlot->plotLayout()->addElement(0, 0, title);
connect(mPlot, &QCustomPlot::mousePress, this, [=] { xAxisAutoChange = false; });
connect(mPlot, &QCustomPlot::mouseRelease, this, [=] { xAxisAutoChange = true; });
mPlot->setInteractions(QCP::iRangeDrag);
QList<QCPAxis*>list;
list.append(mPlot->xAxis);
mPlot->axisRect()->setRangeDragAxes(list);
mPlot->axisRect()->setupFullAxesBox();
mTimerThread = new QThread(this);
mDataTimer = new QTimer();
connect(mDataTimer, SIGNAL(timeout()), this, SLOT(timerSlot()), Qt::DirectConnection);
connect(mTimerThread, &QThread::finished, mDataTimer, &QObject::deleteLater);
connect(mTimerThread, &QThread::finished, mTimerThread, &QObject::deleteLater);
connect(this, &realTimeDataDisplay::updateUICustomPlot, this, &realTimeDataDisplay::onUpdateUICustomPlot);
mTimerThread->start();
mDataTimer->start(16);
mDataTimer->moveToThread(mTimerThread);
qDebug() << "this Thread:" << QThread::currentThreadId() << QThread::currentThread();
mTag1 = new AxisTag(mGraph1->valueAxis());
mTag1->setPen(mGraph1->pen());
mTag2 = new AxisTag(mGraph2->valueAxis());
mTag2->setPen(mGraph2->pen());
mPlot->legend->setVisible(true);
mPlot->legend->setBrush(QColor(255, 255, 255, 150));
}
realTimeDataDisplay::~realTimeDataDisplay()
{
if (mDataTimer)
{
mTimerThread->quit();
mTimerThread->wait();
//connect: &QObject::deleteLater不需要delete
mTimerThread = nullptr;
mDataTimer = nullptr;
}
}
void realTimeDataDisplay::onUpdateUICustomPlot(double key, double v1, double v2)
{
if (xAxisAutoChange)
mPlot->xAxis->setRange(key, 16, Qt::AlignRight);
mTag1->updatePosition(v1);
mTag2->updatePosition(v2);
if (v1 > 0)
mTag1->setText("+" + QString::number(v1, 'f', 2));
else
mTag1->setText(QString::number(v1, 'f', 2));
if (v2 > 0)
mTag2->setText("+" + QString::number(v2, 'f', 2));
else
mTag2->setText(QString::number(v2, 'f', 2));
mPlot->replot();
}
void realTimeDataDisplay::timerSlot()
{
//qDebug() << "timerSlot Thread:" << QThread::currentThreadId() << QThread::currentThread();
static QTime timeStart = QTime::currentTime();
double key = timeStart.msecsTo(QTime::currentTime()) / 1000.0;
static double lastFpsKey;
static int frameCount;
++frameCount;
if (key - lastFpsKey > 2) // average fps over 2 seconds
{
ui.statusBar->showMessage(QString("%1 FPS").arg(frameCount / (key - lastFpsKey), 0, 'f', 0), 0);
lastFpsKey = key;
frameCount = 0;
}
mPlot->graph(0)->addData(key, qSin(key) + qSin(key / 0.3843));
mPlot->graph(1)->addData(key, qSin(key));
double graph1Value = mGraph1->dataMainValue(mGraph1->dataCount() - 1);
double graph2Value = mGraph2->dataMainValue(mGraph2->dataCount() - 1);
emit updateUICustomPlot(key, graph1Value, graph2Value);
//mTag1->updatePosition(graph1Value);
//mTag2->updatePosition(graph2Value);
//if (graph1Value > 0)
// mTag1->setText("+" + QString::number(graph1Value, 'f', 2));
//else
// mTag1->setText(QString::number(graph1Value, 'f', 2));
//if (graph2Value > 0)
// mTag2->setText("+" + QString::number(graph2Value, 'f', 2));
//else
// mTag2->setText(QString::number(graph2Value, 'f', 2));
//mPlot->replot();
}