Qt绘制动态曲线

#ifndef QLINEWIDGET_H
#define QLINEWIDGET_H

#include <QWidget>
#include <QtCharts/QChart>
#include <QtCharts/QChartView>
#include <QtCharts/QPieSeries>
#include <QtCharts/QPieSlice>
#include <QtCharts/QAbstractBarSeries>
#include <QtCharts/QPercentBarSeries>
#include <QtCharts/QStackedBarSeries>
#include <QtCharts/QBarSeries>
#include <QtCharts/QBarSet>
#include <QtCharts/QLineSeries>
#include <QtCharts/QSplineSeries>
#include <QtCharts/QScatterSeries>
#include <QtCharts/QAreaSeries>
#include <QtCharts/QLegend>
#include <QtWidgets/QGridLayout>
#include <QtWidgets/QFormLayout>
#include <QtWidgets/QComboBox>
#include <QtWidgets/QSpinBox>
#include <QtWidgets/QCheckBox>
#include <QtWidgets/QGroupBox>
#include <QtWidgets/QLabel>
#include <QtCore/QTime>
#include <QtCharts/QBarCategoryAxis>
#include <QtCharts/QChartGlobal>
#include <QtCharts/QValueAxis> 
#include "ui_qlinewidget.h"
#ifdef _DEBUG
#pragma comment(lib, "Qt5Chartsd")
#else
#pragma comment(lib, "Qt5Charts")
#endif

QT_CHARTS_USE_NAMESPACE
class QLineWidget : public QWidget
{
	Q_OBJECT

public:
	QLineWidget(QWidget *parent = 0);
	~QLineWidget();
public:
	void CreateChart();
public:
	void addData(int value);
	int timerId;
	int maxSize;  // data 最多存储 maxSize 个元素
	int maxX;
	int maxY;
	QList<double> data; // 存储业务数据的 list
	QChart *chart;
	QChartView *chartView;
	QSplineSeries *splineSeries;
	QScatterSeries *scatterSeries;
	QHBoxLayout *layout;
	QValueAxis *axisx;
	QValueAxis *axisy;
private:
	Ui::QLineWidget ui;
};

#endif // QLINEWIDGET_H

#include "qlinewidget.h"

QLineWidget::QLineWidget(QWidget *parent)
	: QWidget(parent)
{
	ui.setupUi(this);

	CreateChart();
}

QLineWidget::~QLineWidget()
{
	delete chart;
	chart = NULL;
}

void QLineWidget::CreateChart()
{
	maxSize = 100; // 只存储最新的 100 个数据
	maxX = maxSize;
	maxY = 101;
	

	splineSeries = new QSplineSeries();
	scatterSeries = new QScatterSeries();
	scatterSeries->setMarkerSize(1);
	splineSeries->setPointLabelsVisible();
	chart = new QChart();
	chart->addSeries(splineSeries);
	chart->addSeries(scatterSeries);
	chart->legend()->hide();
	chart->setTitle(QString::fromLocal8Bit("实时动态曲线"));
	chart->createDefaultAxes();
	chart->axisX()->setRange(0, maxX);
	chart->axisY()->setRange(0, maxY);
	chartView = new QChartView(chart);

	axisx = new QValueAxis;
	axisx->setGridLineVisible(true);
	
	axisx->setTitleText("sample time(s)");
	chartView->chart()->setAxisX(axisx, splineSeries);
	axisy = new QValueAxis;
	axisy->setGridLineVisible(true);
	axisy->setTitleText("height(meter)");
	chartView->chart()->setAxisY(axisy, splineSeries);
	chartView->setRenderHint(QPainter::Antialiasing);


	layout = new QHBoxLayout();
	layout->setContentsMargins(0, 0, 0, 0);
	layout->addWidget(chartView);
	setLayout(layout);
}

void QLineWidget::addData(int value)
{
	data << value;
	// 数据个数超过了最大数量,则删除所有数据,从头开始。
	while (data.size() > maxSize) 
	{
		data.clear();
		
	}
	// 界面被隐藏后就没有必要绘制数据的曲线了
	if (isVisible()) 
	{
		splineSeries->clear();
		scatterSeries->clear();
		int dx = maxX / (maxSize - 1);
		for (int i = 0; i < data.size(); ++i)
		{
			splineSeries->append(i*dx, data.at(i));
			scatterSeries->append(i*dx, data.at(i));
		}
		
	}

}

//外部widget调用该函数即可
ui.widget->addData(rand() % 100);

使用步骤:
1,主widget下添加一个widget 控件,将该控件提升为QLineWidget。
2,调用addData函数添加数据即可完成绘制。
在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值