通过定时器中断,实现简单的曲线动态显示
charttest.h
#ifndef CHARTTEST_H
#define CHARTTEST_H
#include <QtWidgets/QWidget>
#include "ui_charttest.h"
#include <QHBoxLayout>
#include "myChart.h"
#define PI 3.14159
using namespace std;
class chartTest : public QWidget
{
Q_OBJECT
public:
chartTest(QWidget *parent = 0);
~chartTest();
int MaxSample = 100;
QValueAxis* vaX, *vaY1;
QSplineSeries* spY1;
private slots:
void timer1Slot();
private:
Ui::chartTestClass ui;
myChart* mChart;
QVector<QPointF> vecKv;
void iniChart();
};
#endif // CHARTTEST_H
charttest.cpp
#include "charttest.h"
chartTest::chartTest(QWidget *parent)
: QWidget(parent)
{
ui.setupUi(this);
mChart = new myChart();
mChart->setFixedSize(800, 800);
iniChart();
QTimer* timer1 = new QTimer(this);
timer1->setInterval(10);
connect(timer1, SIGNAL(timeout()), this, SLOT(timer1Slot()));
timer1->start();
}
chartTest::~chartTest()
{
}
void chartTest::iniChart()
{
mChart->setEnabled(true);
mChart->chart()->setTitle("Kv-Vacuum");
mChart->chart()->legend()->hide();
mChart->chart()->setTheme(QtCharts::QChart::ChartTheme::ChartThemeDark);
vaX = new QValueAxis();
vaY1 = new QValueAxis();
spY1 = new QSplineSeries();
vaX->setRange(0, MaxSample);
vaX->setTickCount(7);
vaX->setLabelsColor(QColor(0, 255, 0));
vaX->setTitleText("Sample-Points");
vaY1->setRange(0, 200);
vaY1->setTickCount(6);
vaY1->setLabelsColor(QColor(255,0, 0));
vaY1->setTitleText("Voltage-Kv");
mChart->chart()->addAxis(vaX, Qt::AlignBottom);
mChart->chart()->addAxis(vaY1, Qt::AlignLeft);
mChart->chart()->addSeries(spY1);
spY1->attachAxis(vaX);
spY1->attachAxis(vaY1);
spY1->setColor(QColor(255, 0, 0));
spY1->setUseOpenGL();
QHBoxLayout* hlay = new QHBoxLayout();
hlay->addWidget(mChart);
this->setLayout(hlay);
}
void chartTest::timer1Slot()
{
static int cnt = 0;
if (cnt <= MaxSample)
{
float tmp = 85.0 + 85 * sin(cnt * 4 * PI / MaxSample);
vecKv.push_back(QPointF(cnt, tmp));
}
else
{
for (int i = 1; i < MaxSample; ++i)
{
vecKv[i - 1] = QPointF(vecKv[i - 1].x(), vecKv[i].y());
}
float tmp = 85.0 + 85 * sin(cnt * 4 * PI / MaxSample);
vecKv[MaxSample-1] = QPointF(vecKv[MaxSample-1].x(), tmp);
if (cnt >= 10 * MaxSample)
{
cnt = 0;
vecKv.clear();
}
}
cnt++;
spY1->replace(vecKv);
}