使用QT绘制简单的动态数据折线图

两个核心类时QChart和QLineSeries

下面这个示例代码中,定时器每隔一段时间将曲线图中的数据点向右移动 一个单位,同时调整横坐标轴的范围,实现了一次滚动对应移动一个数据点的效果。

QLineSeries最多容纳4096+1024个点

cpp 复制代码
#include <QtWidgets/QApplication>
#include <QtWidgets/QMainWindow>
#include <QtCharts/QChartView>
#include <QtCharts/QLineSeries>
#include <QtCharts/QValueAxis>
#include <QtCore/QRandomGenerator>
#include <QtCore/QTimer>
#include <QDebug>

QT_CHARTS_USE_NAMESPACE

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QMainWindow window;
    QChartView *chartView = new QChartView(&window);
    window.setCentralWidget(chartView);
    QChart *chart = new QChart();
    chart->legend()->hide();
    chartView->setChart(chart);
    chart->createDefaultAxes();

    QLineSeries *series = new QLineSeries();
    chart->addSeries(series);
    chart->createDefaultAxes();


    QValueAxis *axisX = qobject_cast<QValueAxis *>(chart->axes(Qt::Horizontal).at(0));
    QValueAxis *axisY = qobject_cast<QValueAxis *>(chart->axes(Qt::Vertical).at(0));

    axisY->setRange(0, 120);

    // 初始化数据点
    qreal startX = 0;
    for (int i = 0; i < 100; ++i) {
        series->append(startX + i, QRandomGenerator::global()->bounded(100));
    }

    int currentIndex = 0; // 当前数据点索引

    QTimer timer;
    timer.setInterval(100);
    QObject::connect(&timer, &QTimer::timeout, [&](){
        if (series->points().size() >= 4096 + 1024)
        {
            int n = series->points().size() - 4096;
            series->removePoints(0, n);
            currentIndex-= n;
            qDebug() << "remove " << n;
        }

        qDebug() << currentIndex;
        // 移动数据点
        //series->remove(0);
        series->append(series->points().last().x() + 1, QRandomGenerator::global()->bounded(100));

        // 计算滚动后的横坐标范围
        qreal minX = series->points().at(currentIndex).x();
        qreal maxX = series->points().last().x();
        qreal targetMinX = minX + 1;
        qreal targetMaxX = maxX + 1;
        axisX->setRange(targetMinX, targetMaxX);
        currentIndex++;

    });

    timer.start();

    window.resize(800, 600);
    window.show();

    return a.exec();
}

.pro文件

cpp 复制代码
QT       += core gui charts

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

CONFIG += c++11

# The following define makes your compiler emit warnings if you use
# any Qt feature that has been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

# You can also make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

SOURCES += \
    main.cpp

HEADERS +=

TRANSLATIONS += \
    myChart_zh_CN.ts

# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target
相关推荐
Elias不吃糖1 小时前
Linux 环境适应 Day 1 全面笔记
linux·c++·笔记
奔跑吧 android1 小时前
【Docker】【03.使用docker搭建ubuntu20.04 Qt5.12 开发环境】
qt·docker·ubuntu20.04·qt5.12
无限进步_2 小时前
C语言字符串连接实现详解:掌握自定义strcat函数
c语言·开发语言·c++·后端·算法·visual studio
oscar9992 小时前
CSP-J教程——第一阶段——第二课:变量与数据类型
c++·数据类型·csp-j
qwepoilkjasd2 小时前
RapidJSON 完整学习指南
c++
一朵筋斗云2 小时前
c++
c++
有趣的我3 小时前
关于stub和mock
c++
Yupureki3 小时前
从零开始的C++学习生活 18:C语言复习课(期末速通)
c语言·数据结构·c++·学习·visual studio
永远有缘4 小时前
四种编程语言常用函数对比表
java·开发语言·c++·python
C++_girl4 小时前
c++、java/python语言有什么区别?为什么c++更快?
java·开发语言·c++