Qt通过QChart实时显示曲线,显示两个纵坐标轴并刷新

头文件包含

本样例下载地址:https://download.csdn.net/download/birenxiaofeigg/11244404

#include <QChartView>
#include <QtCharts/QChartView>
#include <QtCharts/QValueAxis>
#include <QtCharts/QSplineSeries>

#include <QVector>
#include <QTimer>
#include <QHBoxLayout>

新建QChartView类并作初始化

void chartTest::iniChart()
{
	mChart = new QChartView();
	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();
	vaY2 = new QValueAxis();

	spY1 = new QSplineSeries();
	spY2 = new QSplineSeries();

	//vecKv = new QVector<QPointF>;
	//vecVacc = new QVector<QPointF>;

	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");

	vaY2->setRange(0, 10);
	vaY2->setTickCount(6);
	vaY2->setLabelsColor(QColor(0, 0, 255));
	vaY2->setTitleText("Penning-V");

	mChart->chart()->addAxis(vaX, Qt::AlignBottom);
	mChart->chart()->addAxis(vaY1, Qt::AlignLeft);
	mChart->chart()->addAxis(vaY2, Qt::AlignRight);
	mChart->chart()->addSeries(spY1);
	mChart->chart()->addSeries(spY2);

	
	spY1->attachAxis(vaX);
	spY1->attachAxis(vaY1);
	spY1->setColor(QColor(255, 0, 0));
	spY1->setUseOpenGL();// 开启openGL加速

	spY2->attachAxis(vaX);
	spY2->attachAxis(vaY2);
	spY2->setColor(QColor(0, 0, 255));
	spY2->setUseOpenGL();

	QHBoxLayout* hlay = new QHBoxLayout();
	hlay->addWidget(mChart);
	this->setLayout(hlay);

	QTimer* timer1 = new QTimer(this);
	timer1->setInterval(15);
	connect(timer1, SIGNAL(timeout()), this, SLOT(timer1Slot()));
	timer1->start();
}

定时器处理,数据刷新

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));
		tmp = 5 + 5 * cos(cnt * 4 * PI / MaxSample);
		vecVacc.push_back(QPointF(cnt, tmp));
	}
	else
	{
		for (int i = 1; i < MaxSample; ++i)
		{
			vecKv[i - 1] = QPointF(vecKv[i - 1].x(), vecKv[i].y());
			vecVacc[i - 1] = QPointF(vecVacc[i - 1].x(), vecVacc[i].y());
		}
		float tmp = 85.0 + 85 * sin(cnt * 4 * PI / MaxSample);
		vecKv[MaxSample-1] = QPointF(vecKv[MaxSample-1].x(), tmp);
		tmp = 5 + 5 * cos(cnt * 4 * PI / MaxSample);
		vecVacc[MaxSample-1] = QPointF(vecVacc[MaxSample-1].x(), tmp);

		if (cnt >= 3 * MaxSample)// 计数器复位
		{
			cnt = 0;
			vecKv.clear();
			vecVacc.clear();
		}
	}
	cnt++;

	spY1->replace(vecKv);
	spY2->replace(vecVacc);
}

图像显示

从0开始刷新

在这里插入图片描述

覆盖旧数据刷新

在这里插入图片描述
本样例下载地址:https://download.csdn.net/download/birenxiaofeigg/11244404

发布了56 篇原创文章 · 获赞 10 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/birenxiaofeigg/article/details/91994939
今日推荐