Qt QML ChartView动态添加曲线和更新数据

main.cpp

#include <QApplication >
#include <QQmlApplicationEngine>
#include <QQmlContext>
#include "CppChartModel.h"

int main(int argc, char *argv[])
{
    QApplication  app(argc, argv);
    CppChartModel chartModel;
    QQmlApplicationEngine engine;
    engine.rootContext()->setContextProperty("chartModel", &chartModel);
    const QUrl url(QStringLiteral("qrc:/testChart/Main.qml"));
    QObject::connect(
        &engine,
        &QQmlApplicationEngine::objectCreationFailed,
        &app,
        []() { QCoreApplication::exit(-1); },
        Qt::QueuedConnection);
    engine.load(url);

    return app.exec();
}

Main.qm

import QtQuick
import QtQuick.Controls
import QtCharts 2.7

Window  {
    visible: true
    width: 600
    height: 400
    title: "动态 ChartView 示例"

    ChartView {
        id: chartView
        anchors.fill: parent
        antialiasing: true

        // 初始化轴
        ValueAxis {
            id: axisX
            min: 0
            max: 100
            labelFormat: "%d"
            tickCount:5
        }

        ValueAxis {
            id: axisY
            min: 0
            max: 1
            labelFormat: "%.2f"
            tickCount:5
        }

        Connections {
            target: chartModel
            function onSeriesAdded(seriesIndex){
                var series = chartModel.series(seriesIndex);
                var chartSeries = chartView.series(seriesIndex);
                if (!chartSeries) {
                    var newSeries = chartView.createSeries(ChartView.SeriesTypeLine, "数据系列 " + seriesIndex, axisX, axisY);
                }
            }
            function onSeriesUpdate(seriesIndex){
                var series = chartModel.series(seriesIndex);
                var chartSeries = chartView.series(seriesIndex);
                if (chartSeries) {
                    chartSeries.clear();
                    for (var i = 0; i < series.length; i++) {
                        console.log(series[i].x+":"+series[i].y)
                        chartSeries.append(series[i].x, series[i].y);
                    }
                }
            }
        }
    }

    Row {
        anchors.bottom: parent.bottom
        anchors.horizontalCenter: parent.horizontalCenter
        spacing: 10
        Button {
            id:addSeries
            text: "新增曲线"
            onClicked: {
                chartModel.addSeries();
            }
        }

        Button {
            id:addData
            text: "追加数据"
            onClicked: {
                chartModel.appendData();
            }
        }
    }
}

CppChartModel.h

#ifndef CPPCHARTMODEL_H
#define CPPCHARTMODEL_H

#include <QObject>
#include <QVector>
#include <QPointF>
#include <QVariant>
#include <QRandomGenerator>
class CppChartModel : public QObject {
    Q_OBJECT

public:
    explicit CppChartModel(QObject *parent = nullptr);

    Q_INVOKABLE QVariant series(int index);
    Q_INVOKABLE void addSeries();
    Q_INVOKABLE void appendData();

signals:
    void seriesAdded(int seriesIndex);
    void seriesUpdate(int seriesIndex);

private:
    QVector<QVector<QPointF>> m_seriesData;
    QRandomGenerator *randomGen = QRandomGenerator::global();
};

#endif // CPPCHARTMODEL_H

CppChartModel.cpp

#include "CppChartModel.h"
#include <QRandomGenerator>

CppChartModel::CppChartModel(QObject *parent) : QObject(parent) {

}

QVariant CppChartModel::series(int index) {
    if (index < 0 || index >= m_seriesData.size()) {
        return QVariant();
    }
    return QVariant::fromValue(m_seriesData[index]);
}

void CppChartModel::addSeries() {
    QVector<QPointF> series;
    m_seriesData.append(series);
    emit seriesAdded(m_seriesData.length()-1);
}

void CppChartModel::appendData()
{
    for(int i=0;i<m_seriesData.length();i++)
    {
        QVector<QPointF> &series = m_seriesData[i];
        int x = series.isEmpty() ? 0 : series.last().x() + 1;
        double y = randomGen->bounded(1.0);
        series.append(QPointF(x, y));
        emit seriesUpdate(i);
    }
}

 

源码下载地址

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

码河漫步

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

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

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

打赏作者

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

抵扣说明:

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

余额充值