Qt小例子学习77 - C++ 公开的Series数据在 QML 中创建图表
UiData.h
#ifndef UIDATA_H
#define UIDATA_H
#include <QLineSeries>
#include <QObject>
QT_CHARTS_USE_NAMESPACE
class UiData : public QObject
{
Q_OBJECT
Q_PROPERTY(QLineSeries *xy READ xy WRITE setXy NOTIFY xyChanged)
Q_PROPERTY(qreal xmin READ xmin NOTIFY xminChanged)
Q_PROPERTY(qreal xmax READ xmax NOTIFY xmaxChanged)
Q_PROPERTY(qreal ymin READ ymin NOTIFY yminChanged)
Q_PROPERTY(qreal ymax READ ymax NOTIFY ymaxChanged)
public:
UiData(QObject *parent = nullptr);
QLineSeries *xy() const;
void setXy(QLineSeries *xy);
qreal xmin() const;
qreal xmax() const;
qreal ymin() const;
qreal ymax() const;
public slots:
void newData(qreal x, qreal y);
signals:
void xyChanged();
void xminChanged();
void xmaxChanged();
void yminChanged();
void ymaxChanged();
private:
QLineSeries *mXy;
qreal mXmin;
qreal mXmax;
qreal mYmin;
qreal mYmax;
};
#endif // UIDATA_H
UiData.cpp
#include "uidata.h"
UiData::UiData(QObject *parent) : QObject(parent), mXy(nullptr) {}
QLineSeries *UiData::xy() const { return mXy; }
void UiData::setXy(QLineSeries *xy)
{
if (mXy == xy)
return;
if (mXy)
if (mXy->parent() == this)
delete mXy;
mXy = xy;
emit xyChanged();
}
qreal UiData::xmin() const { return mXmin; }
qreal UiData::xmax() const { return mXmax; }
qreal UiData::ymin() const { return mYmin; }
qreal UiData::ymax() const { return mYmax; }
void UiData::newData(qreal x, qreal y)
{
if (mXy)
{
if (x > mXmax)
{
mXmax = x;
emit xmaxChanged();
}
else if (x < mXmin)
{
mXmin = x;
emit xminChanged();
}
if (y > mYmax)
{
mYmax = y;
emit ymaxChanged();
}
else if (y < mYmin)
{
mYmin = y;
emit yminChanged();
}
mXy->append(x, y);
}
}
main.qml
import QtQuick 2.9
import QtQuick.Window 2.2
import QtCharts 2.0
Window {
visible: true
width: 640
height: 480
title: qsTr("ChartView Example")
ChartView{
title: "Line"
anchors.fill: parent
antialiasing: true
ValueAxis{
id: _axisX;
min: uiData.xmax -uiData.xmin > 10 ? uiData.xmax -10 : uiData.xmin
max: uiData.xmax
}
ValueAxis{
id: _axisY;
min: uiData.ymin -1
max: uiData.ymax +1
}
LineSeries{
id: _xySeries;
axisX: _axisX;
axisY: _axisY;
}
}
Component.onCompleted: uiData.xy = _xySeries
}
main.cpp
#include "uidata.h"
#include <QApplication>
#include <QQmlApplicationEngine>
#include <QQmlContext>
#include <QTimer>
#include <random>
int main(int argc, char *argv[])
{
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
std::random_device rd;
std::mt19937 rng(rd());
std::uniform_int_distribution<int> uni(0, 100);
QApplication app(argc, argv);
UiData uiData;
QTimer timer;
static int counter = 0;
QObject::connect(&timer, &QTimer::timeout, [&uiData, &uni, &rng]()
{
uiData.newData(counter, uni(rng));
counter++;
});
timer.start(100);
QQmlApplicationEngine engine;
engine.rootContext()->setContextProperty("uiData", &uiData);
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
if (engine.rootObjects().isEmpty())
return -1;
return app.exec();
}
main.qml
import QtQuick 2.9
import QtQuick.Window 2.2
import QtCharts 2.0
Window {
visible: true
width: 640
height: 480
title: qsTr("ChartView Example")
ChartView{
title: "Line"
anchors.fill: parent
antialiasing: true
ValueAxis{
id: _axisX;
min: uiData.xmax -uiData.xmin > 10 ? uiData.xmax -10 : uiData.xmin
max: uiData.xmax
}
ValueAxis{
id: _axisY;
min: uiData.ymin -1
max: uiData.ymax +1
}
LineSeries{
id: _xySeries;
axisX: _axisX;
axisY: _axisY;
}
}
Component.onCompleted: uiData.xy = _xySeries
}