Qt動態圖表更新實現

1.Qt簡單折線圖表的使用

//.pro中加入
QT       += charts

//包含頭文件
#include<QtCharts>
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幫助文檔

4.線程之間共享數據出現QObject::connect: Cannot queue arguments of type的錯誤的解決方法

//錯誤
QObject::connect: Cannot queue arguments of type 'QVector<QPointF>'
(Make sure 'QVector<QPointF>' is registered using qRegisterMetaType().)

解決方法:

//包含頭文件
#include <QMetaType>

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

//註冊類型
qRegisterMetaType<QVector<QPointF>>("QVector<QPointF>");
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章