Qt Charts 动态实时绘制各种曲线图

在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】


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

 m_chartView = new QChartView(m_chart,this);//画布
    m_chart = m_chartView->chart();//画笔

画笔绑在画布上,就新建了一个QChartView 和一个 QChart 指针。
 类 Series 是用来添加数据的对象(可以理解为一个集合)。常见的 QLineSeries,折线类,画出来的先棱角更强,QSplineSeries,曲线类,画出来更平滑,QScatterSeries,点类,画出来是一个个单独的点。Qt文档对这些类都有很详细的说明,并配有图画。
类似于QChart 、QChartView、Series ,还有QValueAxis类(数值类型的坐标轴)等等,不再啰嗦,下面的代码里都有。并且有很详细的注释,想学的朋友一定仔细看一遍肯定能看明白。
 

 ui->setupUi(this);
    m_chart = new QChart();
    m_chartView = new QChartView(m_chart,this);//画布
    m_chart = m_chartView->chart();//画笔
    m_chartView->setRubberBand(QChartView::NoRubberBand);  //矩形缩放

    m_chartView->setRenderHint(QPainter::Antialiasing); //设置抗锯齿
    m_chartView->resize(600, 600);   //画布大小
    m_chartView->setContentsMargins(0,0,0,0);
    m_chartView->show(); //显示
    //设置x坐标轴
    axisX = new QValueAxis;
    axisX->setRange(0, 100);  //范围
    axisX->setLabelFormat("%d"); //图例的格式  %d为十进制显示
    axisX->setGridLineVisible(true);//网格
    axisX->setTickCount(10);   //主要刻度
//	axisX->setMinorTickCount(5);//小刻度
    axisX->setTitleText("time/(s)");//标题
//设置y坐标轴
    axisY = new QValueAxis;
    axisY->setRange(0, 20);
    axisY->setLabelFormat("%d");
    axisY->setGridLineVisible(true);
    axisY->setTickCount(10);//轴上有多少个标记数目
    axisY->setMinorTickCount(5);//主要刻度之间有多少网格线
    axisY->setTitleText("altitude/(%)");

    m_chart->addAxis(axisX, Qt::AlignBottom);  //将坐标轴加到chart上,居下
    m_chart->addAxis(axisY, Qt::AlignLeft);//居左

   //m_chart->setTitle("example of chart");   //设置图表标题
    //m_chart->setAnimationOptions(QChart::SeriesAnimations);  //曲线动画模式,不能启用这一项或是选择这个选项,这个会导致曲线闪烁
    m_chart->legend()->setVisible(true);  //设置图例可见
    m_chart->legend()->setLayoutDirection(Qt::LeftToRight);
    m_chart->legend()->setAlignment(Qt::AlignLeft);
  //生成一小段数据列表用作绘图初始数据
    QList<QPointF> mydata1;
    for (int i = 0; i <100; i++)
    {
        mydata1.append(QPointF(i, 0.1*i));
    }
    addSeries(mydata1); //增加一条曲线,数据集为mydata1
    connectMarkers();  //将曲线与图例连接起来,可以勾选进行显示与隐藏

    m_chart->setAxisX(axisX, m_serieslist.first());  //将x和y坐标轴与第一条曲线连接
    m_chart->setAxisY(axisY, m_serieslist.first());
    timeId = startTimer(1000);    //qobject中的函数,设置定时器时间间隔

线都是又一系列的点构成的,线是点的集合,容器里在包含一系列的线,用画笔绘制在画布上,这就是QChart

void Widget::addSeries(QList<QPointF> &data)  //用于新增曲线
{

    QSplineSeries *series = new QSplineSeries(this);//平滑曲线的集合
    m_serieslist.append(series);//将曲线加到曲线列表中进行管理
    series->setName(QString("line " + QString::number(m_serieslist.count()))); //设置曲线对应的名字,用于图例显示
    series->append(data);  //将数据加到曲线中
    m_chart->addSeries(series);//将曲线增入chart中
    axisX->setRange(0, series->count());  //坐标轴初始范围为图表中的数据数。 这个在绘制多条曲线中需注释
    QPen splinePen ,linePen;
    splinePen.setBrush(Qt::red);
    splinePen.setColor(Qt::red);
    series->setPen(splinePen);

    QSplineSeries *lineSeries = new QSplineSeries(this);//折线类点的集合
    lineSeries->setName(QStringLiteral("折线"));
    QList<QPointF> lineData;
    QPoint newPoint;
    foreach (QPointF point, data) {
       newPoint.setX(point.x() * 1.5);
       newPoint.setY(point.y() * 1.5);
       lineData.append(newPoint);
    }
//    lineSeries->append(0,0);
//    lineSeries->append(10,10);
//    lineSeries->append(15,15);
    lineSeries->append(lineData);
    linePen.setBrush(Qt::yellow);
    lineSeries->setPen(linePen);
    m_serieslist.append(lineSeries);
    m_chart->addSeries(lineSeries);

}

的思想

 

利用定时器定时刷新不同的点,来实时绘制动态曲线

void Widget::timerEvent(QTimerEvent *event)    //定时器事件的重构
{
    if (event->timerId() == timeId)//定时器时间到,模拟数据填充
    {
        static QTime dataTime(QTime::currentTime());
        long int eltime = dataTime.elapsed();  //上次start经过毫秒数
        static int lastpointtime = 1;
        int size = (eltime - lastpointtime);//数据个数
        qDebug() << "size-->" << size;
        foreach (QSplineSeries  *splineSeries, m_serieslist) {
            if (splineSeries->isVisible())
            {
                QVector<QPointF> olddata = splineSeries->pointsVector();
                olddata.append(QPointF(lastpointtime +olddata.count(), lastpointtime*0.3));//填充数据--->>相当于每一分钟增加一点
                axisX->setRange(0, lastpointtime + splineSeries->count());//设置x坐标轴
                //后期需更改为一开始固定,只有当数据个数超出坐标轴范围时坐标轴开始扩展。
                splineSeries->replace(olddata);
                lastpointtime++;
            }
        }

    }
}

效果图

 

源码请在链接在找到源码

### 回答1: QT Charts是一个用于创建曲线图的图表库。它是QT框架的一部分,可以方便地与其他QT组件集成,提供了丰富的功能和灵活的配置选项。 使用QT Charts,我们可以轻松地创建各种类型的曲线图,如折线图、曲线图、散点图等,并可以进行自定义设置。我们可以设置曲线的样式、颜色、粗细,以及坐标轴的刻度、范围等。 QT Charts还提供了交互功能,用户可以通过缩放、平移、拖拽等操作对曲线图进行交互操作,从而实现更好的用户体验。 在数据方面,QT Charts支持从外部文件或数据库中导入数据,并可以实时更新图表中的数据。我们可以通过添加数据、删除数据、更新数据等操作来动态显示数据的变化。 此外,QT Charts还支持导出图表为图片或PDF格式,方便我们将图表用于报告、文档等其他用途。 总结来说,QT Charts是一个功能强大、易于使用的曲线图工具,它为我们提供了创建、配置和交互图表的功能,并支持数据的导入和导出。无论是在科学研究、数据可视化还是其他应用领域,QT Charts都能提供出色的图表展示效果。 ### 回答2: Qt ChartsQt框架下的一个数据可视化库,用于绘制各种类型的曲线图。它提供了丰富的图表组件和功能,使得开发者可以轻松地在Qt应用程序中添加曲线图功能。 Qt Charts支持多种常见的曲线图类型,如折线图、曲线图、面积图等。可以通过简单的代码来创建和修改这些图表,使开发者能够快速实现自己所需的数据展示效果。 使用Qt Charts,可以方便地设置图表的标题、轴标签、图例等属性,使得图表具有更好的可读性和易用性。同时,还可以通过调整图表的样式和颜色等属性来使图表更加美观。 Qt Charts还提供了丰富的交互功能,如缩放、平移、标记等。通过这些功能,用户可以更加灵活地操作和分析图表中的数据。 除了基本的曲线图功能外,Qt Charts还支持动态更新图表数据,并能够进行实时更新和刷新。这使得开发者能够轻松实现动态数据展示和实时监控等功能。 总的来说,Qt Charts是一个功能强大的曲线图库,它能够帮助开发者快速、方便地绘制和展示各种类型的曲线图。无论是日常数据分析、科学计算还是工业监控等领域,都可以通过Qt Charts实现强大的可视化效果。 ### 回答3: Qt ChartsQt框架提供的用于绘制曲线图的模块。它提供了一种简便而强大的方式来可视化数据。 Qt Charts的主要特点是其简单易用的API和丰富的图表类型。开发人员可以快速创建曲线图,并具有定制化的能力。它支持线性曲线、散点图、条形图、面积图等多种常见的图表类型,满足了各种数据可视化的需求。 Qt Charts还提供了丰富的交互功能,例如缩放、拖动、选中、标记等。这些交互操作使用户可以更好地探索数据,并从中获得更多信息。 除了基本的曲线图功能,Qt Charts还支持多个曲线绘制曲线之间的联动和对齐、曲线图的动效果等高级功能。这些功能使开发人员可以创建更丰富、更生动的曲线图Qt Charts的代码结构清晰、易于理解,同时也提供了丰富的示例和文档。开发人员可以通过示例来学习如何使用不同类型的图表,并参考文档了解更多的细节。这有助于开发人员快速上手和深入使用Qt Charts。 总的来说,Qt Charts是一个功能强大且易于使用的曲线图绘制工具。它可以帮助开发人员快速创建各种类型的曲线图,并提供了丰富的定制化和交互功能,使数据可视化变得更加简单和有趣。
评论 49
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

漫天飞舞的雪花

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值