QtCharts 时间坐标轴以及利用定时器动态绘制图形

注意!

文章已经进行修改,结构逻辑更加清晰,查看最新的文章和Demo资源请移步↓
新-QtCharts时间坐标轴,利用定时器动态绘制图
↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑

QtCharts 添加时间坐标轴

QtCharts坐标轴说明

QtCharts 的坐标轴主要有两种,一种是QValueAxis 另外一种就是我们需要的QDateTimeAxis
有时候我们需要绘制与时间相关的数据,如与日期相关的天气数据,或者是随分钟变化的传感器数据等,这样就会用到 QDateTimeAxis 坐标轴
目前网上的一些例子,以及QT自带的例子,基本都是和日期相关的数据,没有找到坐标轴是分钟、秒的案例。
踩了一些坑后,写下这篇文章,希望能够帮助到需要的人。

QtCharts初始化操作

如果将来要对x轴时间范围、或者是y轴的范围进行调整,建议在头文件中声明x轴

QDateTimeAxis *axisX_Time ;
QValueAxis *axisY_Data;//数据点

然后在折线图中初始化,绑定数据集,就完成了折线图的初始化

axisX_Time = new QDateTimeAxis(this);//时间轴
axisY_Data= new QValueAxis();//数据点

//QDateTimeAxis需要QDateTime的数值格式
QDateTime temp_StartTime(QDate(2000, 1, 1), QTime(0, 0, 0)); //前面是年月日,后面是小时、分钟、秒
QDateTime temp_EndTime(QDate(2000, 1, 1), QTime(0, 20, 0));//
axisX_Time->setTickCount(5);//设置显示的时间个数
axisX_Time->setRange(temp_StartTime, temp_EndTime);//设置显示范围

//坐标轴显示方式: 分钟:秒
axisX_Time->setFormat("mm:ss");//如果需要其他时间也可以进行修改

axisY_Data->setRange(0,200);
//最后绑定数据即可
dataSeries->attachAxis(axisX_Time);
dataSeries->attachAxis(axisY_Data);
  • 这里有一个坑,就是关于QDateTime的,如果初始化输入QDateQTime时间不正确,那么QDateTime也是错误的,并且不会报错;
  • 比如QDate如果是(2000,0,1),不会提示错误,但是其实显示的数值会一直是错误的

根据定时器动态添加点

为了实现传感器数据随时间的变化,每秒进行绘制,需要添加一个定时器,设置1s的任务,往chart中添加一个数据。

添加一个定时器

    timeCount = 0;//在头文件中添加一个全局变量,记录秒数
	myTimer = new QTimer(this);
	connect(myTimer , SIGNAL(timeout()), this, SLOT(oneSecondAction()));//连接定时器时间到达响应的槽函数
	myTimer ->start(1000);//1000ms之行一次
	//定时器还有一些函数,可以时时间间隔更为精确

设置每秒的任务

//定期器启动后,1s执行一次的任务
void MyWidget::oneSecondAction() {
	//*******  每秒绘制折线图一次 *******
	addOnePointToChart(dataSeries, timeCount, addData);//addData来自于传感器赋值的数据
	timeCount++;//秒数+1
}

在chart上添加一个点

  • 方法一,这是之前的一种方法,将秒数手动转为时分秒形式
//在折线图上添加一个点
//输入参数说明
//targetSeries:目标曲线集
//secondCount:秒数。即数据添加的横坐标
//y_value:数据的大小
void MyWidget::addOnePointToChart(QLineSeries *targetSeries, int secondCount, int y_value) {

	int second, hour, minute;
	second = secondCount; 
	MyHelper::changeTimeFromSecond(&hour, &minute, &second);//转换为标准的时分秒,保证QTime不会出错
	QDateTime temp_AddTimePos(QDate(2000, 1, 1), QTime(hour, minute, second));//生成一个坐标轴时间QDateTime

	targetSeries->append(temp_AddTimePos.toMSecsSinceEpoch(), y_value);

}

将秒数转换为时分秒的函数

	static void changeTimeFromSecond(int *hour, int *minute, int *second) {

		*hour = *second / 3600;
		*minute = (*second - *hour * 3600) / 60;
		*second -= *hour * 3600 + *minute * 60;
	}
  • 方法二利用addSecs()函数更加简单

void MyWidget::addOnePointToChart(QLineSeries *targetSeries, int secondCount, int y_value) {

	QDateTime temp_AddTimePos(QDate(2000, 1, 1), QTime(0, 0, 0).addSecs(secondCount));//生成一个坐标轴时间QDateTime
	targetSeries->append(temp_AddTimePos.toMSecsSinceEpoch(), y_value);

}

如果坐标轴发现时间从分钟变成了小时,需要对坐标轴进行一下修改

//坐标轴显示方式: 小时:分钟:秒
axisX_Time->setFormat("hh:mm:ss");

其他

评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值