学习Qt Charts - 实时曲线
1、添加坐标轴
按照之前的一篇文章,先在工程中添加QChart、QChartView,代码如下:
Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
ui->setupUi(this);
chart = new QChart();
ChartView = new QChartView(this);
ChartView->setChart(chart);
ui->verticalLayout->addWidget(ChartView);
}
然后定义两个坐标轴,一个用作X轴,一个用作Y轴,
添加头文件:
#include <QtCharts/QValueAxis>
创建两个QValueAxis:
QValueAxis *axisX;
QValueAxis *axisY;
在构造函数中,对两个坐标轴进行实例化,把X轴范围设置为0-10并放置在坐标系的底部,Y轴范围设置为0-10并放置在坐标系的左边,并且添加到QChart中,如下:
Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
ui->setupUi(this);
chart = new QChart();
axisX = new QValueAxis();
axisY = new QValueAxis();
chart->addAxis(axisX,Qt::AlignBottom);
chart->addAxis(axisY,Qt::AlignLeft);
axisX->setTickCount(5);
axisX->setRange(0, 10);
axisY->setRange(0, 10);
ChartView = new QChartView(this);
ChartView->setChart(chart);
ui->verticalLayout->addWidget(ChartView);
}
编译运行,结果如下:

从上图可以看出,成功创建了一个笛卡尔坐标系。
2、使用定时器动态添加数据
这里尝试下使用曲线图,创建一个曲线序列,
- 添加头文件
#include <QtCharts/QSplineSeries>
- 在类声明中添加:
QSplineSeries *series;
- 在构造函数中对series进行实例化,并跟之前创建的坐标轴关联起来:
series = new QSplineSeries(this);
series->attachAxis(axisX);
series->attachAxis(axisY);
然后添加定时器:
Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
.....
QTimer timer;
connect(&timer, &QTimer::timeout, this, &Chart::Timeout_handler);
timer.setInterval(1000);
}
void Dialog::Timeout_handler()
{
}
首先定义一个整形变量x_index,初始化为0,用来给series序列中的x赋值,定时器每触发一个事件,使用随机数生成函数生成的值给series序列中的y赋值,然后x_index的值加一,主要代码如下:
void Dialog::Timeout_handler()
{
QDateTime dt;
QString current_dt = dt.currentDateTime().toString("yyyy:MM:dd:hh:mm:ss:zzz");
qsrand(dt.currentDateTime().toTime_t());
int y = qrand() % 10;
series->append(x_index,y);
x_index ++;
qDebug()<<"x_index:"<<x_index;
}
运行结果如下:

从上图中可以看到曲线是动起来了,可是当x_index大于10的时候,曲线就没有动了,也就是时序列series第10个及后面数据都没有显示出来,
3、实现实时曲线
因为之前X轴范围为0-10,能显示的数据也就只有x值在0-10范围内,超过10的就无法显示,那如果要显示实时更新的数据,该怎么操作呢?
1. 一个方法是当序列series中的数据增加时,X轴范围也增加,代码如下:
void Dialog::Timeout_handler()
{
QDateTime dt;
QString current_dt = dt.currentDateTime().toString("yyyy:MM:dd:hh:mm:ss:zzz");
qsrand(dt.currentDateTime().toTime_t());
int y = qrand() % 10;
series->append(x_index,y);
if(x_index > 10)
axisX->setRange(0, x_index);
x_index ++;
}
当 x_index 超过 10 后,每增加一个,就把x轴显示范围设置为 0-x_inxex,显示效果如下:

2. 还是改变x轴的,不过,可显示区域是固定的
void Dialog::Timeout_handler()
{
QDateTime dt;
QString current_dt = dt.currentDateTime().toString("yyyy:MM:dd:hh:mm:ss:zzz");
qsrand(dt.currentDateTime().toTime_t());
int y = qrand() % 10;
series->append(x_index,y);
if(x_index > 10)
axisX->setRange(x_index-10, x_index);
x_index ++;
}

3. 使用scroll方法
代码如下:
void Dialog::Timeout_handler(){
QDateTime dt;
QString current_dt = dt.currentDateTime().toString("yyyy:MM:dd:hh:mm:ss:zzz");
qsrand(dt.currentDateTime().toTime_t());
int y = qrand() % 10;
series->append(x_index,y);
qreal x = chart->plotArea().width() / 10;
if(x_index > 10)
chart->scroll(x,0);
x_index ++;
}

4. 更新全部serial
这种方法是保持序列series的x轴的值不变,都是0-10,改变的是0-10对应的y轴的值,首先定义一个list用来保存获取到的Y轴的值:
QList<int> y_list;
void Dialog::Timeout_handler()
{
QDateTime dt;
QString current_dt = dt.currentDateTime().toString("yyyy:MM:dd:hh:mm:ss:zzz");
qsrand(dt.currentDateTime().toTime_t());
int y = qrand() % 10;
y_list.append(y);
if(y_list.length()>11)
y_list.removeFirst();
QList<QPointF> points;
points.clear();
for(int i=0;i<y_list.length();i++)
{
points.append(QPointF(i,y_list.at(i)));
}
series->replace(points);
}
效果如下:

上图中可以看到,图标中的曲线一直在变化,可是X轴的范围保持在0-10,
学习Qt Charts - 实时曲线的更多相关文章
- 学习Qt Charts - 不使用UI的情况下使用QTCharts
新建一个Qt Widgets Application项目,不添加UI文件,如下图: 建立工程后,在.pro文件中添加: QT += charts 然后在.h文件中添加: #include " ...
- 学习Qt Charts - Qt Charts的坐标轴
这次来学学Qt chart 的坐标轴 有这么一组数据: 这是深圳市2019年6月份的天气预报(来自中国天气网:深圳),里面有每天的最高温度,把这最高温度做成个数组,如下: int daily_temp ...
- Linux 中使用 QT Charts 显示温度传感器
前一篇笔记中实现了QT的Label控件显示CPU的温度,只能显示当前的温度,并不能反映CPU温度的变化情况,现在来实现使用QT Charts的曲线图实现一个实时曲线来显示CPU的温度. 添加对Qt C ...
- Qt 绘制图表 - Qt Charts版
一.前言 自从 Qt 发布以来,给广大跨平台界面研发人员带来了无数的福利.但是Qt自己却一直没有提供自带的图表库,这就使得 QWT.QCustomPlot 等第三方图表库有了巨大的生存空间,为了降低开 ...
- Qt Charts
简述 Qt Charts模块提供了一套易于使用的图表组件.它采用了Qt Graphics View框架,因此图表可以很容易地集成到现代的用户界面. Qt Charts可以被用作QWidgets.QGr ...
- Qt Charts示例
Qt 5.7 有一些变化,把原来商业版的几个模块用GPLv3协议放到了社区版本里: Qt Charts (GPLv3) Qt Data Visualization (GPLv3) Qt Virtual ...
- Qt入门学习——Qt 5 帮助文档的使用
Qt入门学习——Qt 5 帮助文档的使用 学习图形界面开发,肯定离不开帮助文档的使用,因为它不像 C 语言那样就那么几个函数接口,图形接口的接口可以用海量来形容,常用的我们可能能记住,其它的真的没有必 ...
- Qt Charts的简单安装与使用
http://blog.qt.io/blog/2016/01/18/qt-charts-2-1-0-release/ 下载地址: https://codereview.qt-project.org/# ...
- 学习Qt,Getting started
在界面的设计中,现在用的比较多的是Qt和WPF(C#),以前的MFC已出现衰老趋势.本人最近在学习Qt,觉得很有用,遂决定将学习历程记录下来,或许有感于后之来者,不亦乐哉. 一.Hello Qt #i ...
随机推荐
- 测试报告$\beta$
VisualPytorch beta发布了! 功能概述:通过可视化拖拽网络层方式搭建模型,可选择不同数据集.损失函数.优化器生成可运行pytorch代码 扩展功能:1. 模型搭建支持模块的嵌套:2. ...
- .NetCore·集成Ocelot组件之完全解决方案
阅文时长 | 11.04分钟 字数统计 | 17672.8字符 主要内容 | 1.前言.环境说明.预备知识 2.Ocelot基本使用 3.Ocelot功能挖掘 4.Ocelot集成其他组件 5.避坑指 ...
- .Net Core·热加载的实现及测试
阅文时长 | 0.25分钟 字数统计 | 460字符 主要内容 | 1.引言&背景 2.解决原理&方法 3.声明与参考资料 『.Net Core·热加载的实现及测试』 编写人 | SC ...
- Sed常用功能个人整理
Sed常用功能个人整理 AsdilFibrizo关注 2019.06.24 10:23:41字数 240阅读 15 Sed对1G以下的数据效率很高这里介绍一些个人在工作中遇到的sed问题 1.查找字段 ...
- im-chooser重新选择输入法框架在终端执行im-chooser命令
CentOS 7安装图像桌面.Ibus拼音输入法一.图形桌面安装1.安装额外包yum源(extra package for Enterprise Linux) yum install epel-rel ...
- pgrep cron
# pgrep cron947[root@localhost cron]# pgrep --help Usage: pgrep [options] <pattern> Options: - ...
- nginx 的常用模块
nginx的常用模块 ngx_http_index_module Syntax: index file ...; Default: index index.html; Context: http, s ...
- 云计算OpenStack核心组件---cinder存储服务(10)
一.cinder介绍 1.Block Storage 操作系统获得存储空间的方式一般有两种: (1)通过某种协议(SAS,SCSI,SAN,iSCSI 等)挂接裸硬盘,然后分区.格式化.创建文件系统: ...
- win10 启用Hyper-V并安装Ubuntu20.10
本文的最终目的是要将.netcore5.0(.net5.0)部署在Ubuntu中的docker容器中. 当前环境: 主系统:win10家庭版 虚拟机:Hyper-V (win10自带虚拟机) 虚拟机系 ...
- mysql简单教程-(转自wid)
21分钟 MySQL 入门教程 目录 一.MySQL的相关概念介绍 二.Windows下MySQL的配置 配置步骤 MySQL服务的启动.停止与卸载 三.MySQL脚本的基本组成 四.MySQL中的数 ...