Qt小例子学习92 - 点击创建series createSerie

Qt小例子学习92 - 点击创建series createSerie

Helper.h

#ifndef HELPER_H
#define HELPER_H#include <QObject>class QQuickItem;class Helper : public QObject
{Q_OBJECT
public:using QObject::QObject;Q_INVOKABLE void createSerie(QQuickItem *chartview);Q_INVOKABLE void removeAllSeries(QQuickItem *chartview);
};#endif // HELPER_H

Helper.cpp

#include "helper.h"#include <QAbstractAxis>
#include <QAbstractSeries>
#include <QLineSeries>
#include <QMetaObject>
#include <QQuickItem>
#include <random>
#include <cstring>QT_CHARTS_USE_NAMESPACEvoid Helper::createSerie(QQuickItem *chartview)
{if (!chartview)return;const QMetaObject *mo = chartview->metaObject();if (std::strcmp(mo->className(), "QtCharts::DeclarativeChart") != 0)return;int ix = mo->indexOfEnumerator("SeriesType");QMetaEnum me = mo->enumerator(ix);int type = me.keyToValue("SeriesTypeLine");QAbstractAxis *axis_x = nullptr;QMetaObject::invokeMethod(chartview, "axisX", Qt::DirectConnection,Q_RETURN_ARG(QAbstractAxis *, axis_x));QAbstractAxis *axis_y = nullptr;QMetaObject::invokeMethod(chartview, "axisY", Qt::DirectConnection,Q_RETURN_ARG(QAbstractAxis *, axis_y));QAbstractSeries *serie = nullptr;QMetaObject::invokeMethod(chartview, "createSeries", Qt::DirectConnection,Q_RETURN_ARG(QAbstractSeries *, serie),Q_ARG(int, type),Q_ARG(QString, "serie from c++"),Q_ARG(QAbstractAxis *, axis_x),Q_ARG(QAbstractAxis *, axis_y));if (QLineSeries *line_serie = qobject_cast<QLineSeries *>(serie)){static std::default_random_engine e;static std::uniform_real_distribution<> dis(0, 3);for (int i = 0; i < 14; i++){line_serie->append(i, dis(e));}}
}void Helper::removeAllSeries(QQuickItem *chartview)
{if (!chartview)return;const QMetaObject *mo = chartview->metaObject();if (std::strcmp(mo->className(), "QtCharts::DeclarativeChart") != 0)return;QMetaObject::invokeMethod(chartview, "removeAllSeries", Qt::DirectConnection);
}

main.qml

import QtQuick 2.14
import QtQuick.Window 2.14
import QtQuick.Layouts 1.14
import QtQuick.Controls 2.4
import QtCharts 2.14Window {visible: truewidth: 640height: 480title: qsTr("Hello World")ColumnLayout{anchors.fill: parentRowLayout{Button{id: btntext: "Create serie"Layout.fillWidth: trueonClicked: helper.createSerie(chartview)}Button{text: "Clear series"Layout.fillWidth: trueonClicked: helper.removeAllSeries(chartview);}}ChartView {id: chartviewtitle: "Line"antialiasing: trueLayout.fillWidth: trueLayout.fillHeight: trueLineSeries {name: "LineSeries"XYPoint { x: 0; y: 0 }XYPoint { x: 3; y: 2.1 }XYPoint { x: 8; y: 3.3 }XYPoint { x: 10; y: 2.1 }XYPoint { x: 11; y: 4.9 }XYPoint { x: 12; y: 3.0 }XYPoint { x: 13; y: 3.3 }}axes: [ValueAxis{id: xAxismin: 1.0max: 15.0},ValueAxis{id: yAxismin: 0.0max: 5.0}]}}
}

main.cpp

#include "helper.h"#include <QApplication>
#include <QQmlApplicationEngine>
#include <QQmlContext>int main(int argc, char *argv[])
{QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);QApplication app(argc, argv);Helper helper;QQmlApplicationEngine engine;engine.rootContext()->setContextProperty("helper", &helper);const QUrl url(QStringLiteral("qrc:/main.qml"));QObject::connect(&engine, &QQmlApplicationEngine::objectCreated,&app, [url](QObject *obj, const QUrl &objUrl) {if (!obj && url == objUrl)QCoreApplication::exit(-1);}, Qt::QueuedConnection);engine.load(url);return app.exec();
}

在这里插入图片描述