Qt动态图表更新实现

1.Qt简单折线图表的使用

//.pro中加入
QT       += charts

//包含头文件
#include
using namespace QtCharts;

//动态分配空间
QChartView *myChartView=new QChartView;
QChart *mychart=new QChart;
QLineSeries *myseries=new QLineSeries;//曲线
QValueAxis *x=new QValueAxis;//x轴
QValueAxis *y=new QValueAxis;//y轴

ui->graphicsView->setChart(mychart);

mychart->addSeries(myseries);//添加曲线
x->setRange(0,20);//设置x轴范围
y->setRange(0,10);
mychart->setAxisX(x,myseries);//设置坐标轴
mychart->setAxisY(y,myseries);

for(int i=0;i<100;i++)
{
     
	myseries.append(qrand()%10);//生成100个范围在0~10内的随机数
}

2.数据点挤入更新


动态曲线图的数据更新方法,最常见的是:对一列数据,去掉首部第一个数据点,尾部再增加一个数据点,这就很简单的完成了一次数据更新。

void mywidget::update1P(qreal data)
{
     
	myseries.remove(0);//去掉第一个元素
	myseries.append(data);//尾部加入一个新数据
}

3.整列数据全部更新

在处理数据的程序十分复杂时,需要创建一个线程用于处理数据,此线程处理完数据后emit一个带参信号,由主线程接收,之后整列更新图表。

//子线程中 数据处理线程
void mythread::complexCompute()
{
     
	QVector<QPointF> *dataPoints=QVector<QPointF>;
	//以生成随机数举例
	for(int i=0;i<1000;i++)
	{
     
		dataPoints->append(QPointF(i,qrand()%100));//生成一千个范围在0~1000的随机数点
	}
	emit dataReady(*dataPoints);//发送信号
	delete dataPoints;
}
//主线程中

//将子线程中发送处理好后数据的信号与主线程中更新这些数据的槽函数连接
connect(mythread,SIGNAL(dataReady(QVector<QPointF>)),this,SLOT(dealData(QVector<QPointF>)));

//数据更新
//1.较笨且慢的方法
void mywidget::dealData(QVector<QPointF> inp)
{
     
	myseries.clear();//曲线先清空
	for(int i=0;i<inp.count();i++)
	{
     
		myseries.append(inp.at(i));//再一个个的添加
	}
}

//2.Qt文档中推荐的方法
void mywidget::dealData(QVector<QPointF> inp)
{
     
	myseries.replace(inp);
}

Qt动态图表更新实现_第1张图片

4.线程之间共享数据出现QObject::connect: Cannot queue arguments of type的错误的解决方法

//错误
QObject::connect: Cannot queue arguments of type 'QVector'
(Make sure 'QVector' is registered using qRegisterMetaType().)

解决方法:

//包含头文件
#include 

//加入声明
Q_DECLARE_METATYPE(QVector<QPointF>);

//注册类型
qRegisterMetaType<QVector<QPointF>>("QVector");

你可能感兴趣的:(Qt,qt5,多线程)