使用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
相关推荐
Q741_1471 小时前
C++ 面试高频考点 链表 迭代 递归 力扣 25. K 个一组翻转链表 每日一题 题解
c++·算法·链表·面试·递归·迭代
syker1 小时前
手搓UEFI.h
c++
LIZhang20161 小时前
基于ffmpeg8.0录制mp4文件
开发语言·c++
_OP_CHEN2 小时前
C++进阶:(九)深度剖析unordered_map 与 unordered_set容器
开发语言·c++·stl容器·哈希表·哈希桶·unordered_map·unordered_set
Mark Studio2 小时前
QT linux 静态编译问题记录
开发语言·qt
freedom_1024_2 小时前
LRU缓存淘汰算法详解与C++实现
c++·算法·缓存
无敌最俊朗@2 小时前
C++-Qt-音视频-基础问题01
开发语言·c++
折戟不必沉沙2 小时前
C++四种类型转换cast,其在参数传递时的作用
c++
kyle~2 小时前
C++---万能指针 void* (不绑定具体数据类型,能指向任意类型的内存地址)
开发语言·c++
誰能久伴不乏3 小时前
Linux 进程通信与同步机制:共享内存、内存映射、文件锁与信号量的深度解析
linux·服务器·c++