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);
}
}

833

被折叠的 条评论
为什么被折叠?



