qchart折现图_Qt Charts 动态实时折线图绘制

本文介绍了如何使用Qt Charts库进行动态实时折线图的绘制。相较于Qcustom和qwt,Qt Charts更易用且功能更强大,支持QML。动态绘图的核心是随着横坐标增长,图像向前滚动并添加新点。通过信号和槽机制,如接收到数据时触发绘图。示例代码展示了如何创建QLineSeries,添加数据,更新坐标轴范围,以及实现数据滚动更新的效果。
摘要由CSDN通过智能技术生成

在Qt Charts发布之前, Qt比较著名两个画图插件是 qwt和Qcustom, 其中Qcustom较轻量,只需要在project 中包含qcustomplot.h 和 qcustomplot.cpp 几乎就可以使用。

相比Qcustom,qwt功能更为强大,但是它的安装十分麻烦,阻挡了很多人(包括我)的使用。

但是qwt只是对静态图表的表示非常不错,动态曲线性能并不突出。如果只是静态绘图,或者动态绘制的点并不多,继续用qwt甚至Qcustom完全没问题。

但是如果是新入手Qt绘图,用Qt charts显然是更好的选择,因为它在各方面都比前两者要好,并且也易于使用。

并且qml也支持charts,qml的渲染默认用GPU,成长性更好。

如果你在安装Qt的时候,选择了Qt charts部分,那么在Qt中使用charts 只需要 在 .pro文件中

QT+=charts

并且在程序的开头加上一句 using namespace Qtcharts或者一个宏 QT_CHARTS_USE_NAMESPACE

进入主题: 动态实时折线图绘制

动态绘图,也就是说折线随着横坐标的增长而实时变化。

从这一秒和上一秒的变化看来,就是坐标轴不动,整个图像往前移了一个单位,然后在空出的最后一个位置增加了一个新的点。

想一下,只要你的显示器不能够随着横坐标的增长变宽,上面说的就是不得不做的事情。或者除非你不把最前面的那个点淘汰掉,但是那样的话,你的点只有增,没有删,随着时间的增长,点越来越多,曲线最后只会挤成一团,啥也看不清。

【多说一句,从相对的角度来说,既然可以把图像往前移一个单位,当然也可以坐标轴往后移一个单位,两者造成的结果当然是一样的。

Qt有一个函数scroll可以实现后者的功能,它有两个参数,可以设置每次x、y轴向右和向上滚动的距离。但是scroll函数绘制坐标轴感觉很奇怪……真的有一种在滚的感觉,看起来很难受,具体可以看Qt欢迎界面里面的一个示例子dynamicspline】

把整个图画往前移一个单位这个操作,这就是动态绘图的核心思想。

除了往前移一个单位这个操作,还要有一个触发这个操作的信号。

一般来说,当产生动态绘图这个需求时,都会有一个驱动X轴随时间变化而增长的因素。或者是传感器上读取到一个数据就画一个点,或者说其它控件传过来一个数据就画一个点等等。

如果仅仅是为了学习,也可以声明一个时间戳对象,当规定的时间戳被触发一次,就画一个点。

显然,传感器,其它控件,时间戳都是信号,画图函数是槽。信号被触发一次,槽函数就画一个点。

事先声明,我没用过时间戳,我做的项目是手机蓝牙传过来一个RSSI值就画一个点,之后我贴的代码也是这样写的。

了解了以上两点,动态绘图也就没什么难的了,但是具体还是要看绘图的软件提供什么接口来操作。

下面具体说说Qt charts 怎么操作。

Qt charts中,可以主要一下几个类: QChart 和 QChartView,QChart是用什么画,差不多画笔的意思,QChartView是在什么上画,差不多画布的意思。

QChartView *chartView =newQChartView(this);

chartView *chart = chartView->chart();

就新建了一个QChartView 和一个 QChart 指针。

类 Series 是用来添加数据的对象(可以理解为一个集合)。常见的QLineSeries,折线类,画出来的先棱角更强,QSplineSeries,曲线类,画出来更平滑,QScatterSeries&

### 回答1: 这是Qt Charts模块中的命名空间声明,用于将类放入命名空间中,避免命名冲突。具体来说,QT_CHARTS_BEGIN_NAMESPACE表示开始一个Qt Charts命名空间,QT_CHARTS_END_NAMESPACE表示结束一个Qt Charts命名空间。在这个命名空间中,class QChart;表示声明了一个名为QChart的类。QChart是一个用于绘制表的类,它是Qt Charts模块中的一个核心类。使用QChart,我们可以创建各种类型的表,比如折线图、柱状、饼状等等。 ### 回答2: QT_CHARTS_BEGIN_NAMESPACE是QT Charts库中的一个命名空间开始标记,表示接下来定义的类、函数和变量都属于这个命名空间。命名空间用于防止命名冲突,将不同的代码组织在不同的命名空间中,以提高代码的可维护性和可读性。 class QChart;是在QT_CHARTS_BEGIN_NAMESPACE命名空间中声明的一个类QChart。这个类是QT Charts库中的一个核心类,用于创建和管理表。 QT_CHARTS_END_NAMESPACE是QT Charts库中的一个命名空间结束标记,表示命名空间中定义的类、函数和变量的范围到此结束。 通过使用命名空间,可以避免不同模块中的类、函数和变量之间的命名冲突。同时,将相关的类、函数和变量组织在同一个命名空间中,可以提高代码的可读性和可维护性。 总之,QT_CHARTS_BEGIN_NAMESPACE和QT_CHARTS_END_NAMESPACE是QT Charts库中的命名空间的开始和结束标记,用于定义和组织与表相关的类、函数和变量。 ### 回答3: 在这段代码中, QT_CHARTS_BEGIN_NAMESPACE是一个宏定义,用于标识Qt Charts命名空间的开始。这意味着在它之后声明的所有类、函数和变量都将属于Qt Charts命名空间。class QChart是在QT_CHARTS_BEGIN_NAMESPACE和QT_CHARTS_END_NAMESPACE之间定义的一个类。QChart类是Qt Charts库中的一个重要类,用于绘制各种类型的表,例如折线图、散点、柱状等。QT_CHARTS_END_NAMESPACE是另一个宏定义,用于标识Qt Charts命名空间的结束。在它之后声明的所有类、函数和变量都将不再属于Qt Charts命名空间,除非另有指定。通过使用这种形式的宏定义,可以更方便地组织和管理多个命名空间,避免命名冲突,并提高代码的可读性和可维护性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值