您的位置:首页 > 编程语言 > Qt开发

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

2019-01-16 10:18 5899 查看
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/DoleH/article/details/86237900

文章目录

  • 根据定时器动态添加点
  • 其他
  • 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;//在头文件中添加一个全局变量,记录秒数
    trainingTimer = new QTimer(this);
    connect(trainingTimer, SIGNAL(timeout()), this, SLOT(oneSecondAction()));//连接槽函数,一秒激发一次槽函数
    trainingTimer->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");

    其他

    • 在尝试中发现这里的QTime设置时间分钟数不能超过60,如果要实现纯分:秒显示还需要探索(利用上面方法二就可以完美解决
    • 因为项目的开发。这里还有一个QtCharts绘制动态心电图
    • 下一步还有一个根据传感器数据实时绘制心电图
    内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
    标签: