qxyseries.cpp
991 lines
| 26.5 KiB
| text/x-c
|
CppLexer
Miikka Heikkinen
|
r2854 | /**************************************************************************** | ||
Jani Honkonen
|
r794 | ** | ||
Miikka Heikkinen
|
r2854 | ** Copyright (C) 2016 The Qt Company Ltd. | ||
** Contact: https://www.qt.io/licensing/ | ||||
Jani Honkonen
|
r794 | ** | ||
Miikka Heikkinen
|
r2854 | ** This file is part of the Qt Charts module of the Qt Toolkit. | ||
Jani Honkonen
|
r794 | ** | ||
Miikka Heikkinen
|
r2854 | ** $QT_BEGIN_LICENSE:GPL$ | ||
Titta Heikkala
|
r2845 | ** Commercial License Usage | ||
** Licensees holding valid commercial Qt licenses may use this file in | ||||
** accordance with the commercial license agreement provided with the | ||||
** Software or, alternatively, in accordance with the terms contained in | ||||
** a written agreement between you and The Qt Company. For licensing terms | ||||
Miikka Heikkinen
|
r2854 | ** and conditions see https://www.qt.io/terms-conditions. For further | ||
** information use the contact form at https://www.qt.io/contact-us. | ||||
** | ||||
** GNU General Public License Usage | ||||
** Alternatively, this file may be used under the terms of the GNU | ||||
** General Public License version 3 or (at your option) any later version | ||||
** approved by the KDE Free Qt Foundation. The licenses are as published by | ||||
** the Free Software Foundation and appearing in the file LICENSE.GPL3 | ||||
** included in the packaging of this file. Please review the following | ||||
** information to ensure the GNU General Public License requirements will | ||||
** be met: https://www.gnu.org/licenses/gpl-3.0.html. | ||||
Jani Honkonen
|
r794 | ** | ||
Titta Heikkala
|
r2845 | ** $QT_END_LICENSE$ | ||
** | ||||
Miikka Heikkinen
|
r2854 | ****************************************************************************/ | ||
Jani Honkonen
|
r794 | |||
Titta Heikkala
|
r2714 | #include <QtCharts/QXYSeries> | ||
#include <private/qxyseries_p.h> | ||||
#include <private/abstractdomain_p.h> | ||||
#include <QtCharts/QValueAxis> | ||||
#include <private/xychart_p.h> | ||||
#include <QtCharts/QXYLegendMarker> | ||||
#include <private/charthelpers_p.h> | ||||
#include <private/qchart_p.h> | ||||
#include <QtGui/QPainter> | ||||
sauimone
|
r2175 | |||
Titta Heikkala
|
r2712 | QT_CHARTS_BEGIN_NAMESPACE | ||
Michal Klocek
|
r466 | |||
/*! | ||||
\class QXYSeries | ||||
Titta Heikkala
|
r2639 | \inmodule Qt Charts | ||
Michal Klocek
|
r470 | \brief The QXYSeries class is a base class for line, spline and scatter series. | ||
Michal Klocek
|
r466 | */ | ||
Tero Ahola
|
r1491 | /*! | ||
Titta Heikkala
|
r2639 | \qmltype XYSeries | ||
\instantiates QXYSeries | ||||
Titta Heikkala
|
r2712 | \inqmlmodule QtCharts | ||
Tero Ahola
|
r1491 | |||
Titta Heikkala
|
r2712 | \inherits AbstractSeries | ||
\brief The XYSeries type is a base type for line, spline and scatter series. | ||||
Titta Heikkala
|
r2639 | |||
Titta Heikkala
|
r2712 | The XYSeries class is a base class for line, spline and scatter series. | ||
The class cannot be instantiated directly. | ||||
Titta Heikkala
|
r2639 | */ | ||
Michal Klocek
|
r466 | |||
Tero Ahola
|
r2331 | /*! | ||
\qmlproperty AbstractAxis XYSeries::axisX | ||||
The x axis used for the series. If you leave both axisX and axisXTop undefined, a ValueAxis is created for | ||||
the series. | ||||
\sa axisXTop | ||||
*/ | ||||
/*! | ||||
\qmlproperty AbstractAxis XYSeries::axisY | ||||
The y axis used for the series. If you leave both axisY and axisYRight undefined, a ValueAxis is created for | ||||
the series. | ||||
\sa axisYRight | ||||
*/ | ||||
/*! | ||||
\qmlproperty AbstractAxis XYSeries::axisXTop | ||||
The x axis used for the series, drawn on top of the chart view. Note that you can only provide either axisX or | ||||
axisXTop, but not both. | ||||
\sa axisX | ||||
*/ | ||||
/*! | ||||
\qmlproperty AbstractAxis XYSeries::axisYRight | ||||
The y axis used for the series, drawn to the right on the chart view. Note that you can only provide either axisY | ||||
or axisYRight, but not both. | ||||
\sa axisY | ||||
*/ | ||||
Miikka Heikkinen
|
r2483 | /*! | ||
\qmlproperty AbstractAxis XYSeries::axisAngular | ||||
The angular axis used for the series, drawn around the polar chart view. | ||||
\sa axisX | ||||
*/ | ||||
/*! | ||||
\qmlproperty AbstractAxis XYSeries::axisRadial | ||||
The radial axis used for the series, drawn inside the polar chart view. | ||||
\sa axisY | ||||
*/ | ||||
Jani Honkonen
|
r1336 | /*! | ||
\property QXYSeries::pointsVisible | ||||
Tero Ahola
|
r1491 | Controls if the data points are visible and should be drawn. | ||
*/ | ||||
/*! | ||||
\qmlproperty bool XYSeries::pointsVisible | ||||
Jani Honkonen
|
r1336 | Controls if the data points are visible and should be drawn. | ||
*/ | ||||
Michal Klocek
|
r466 | /*! | ||
\fn QPen QXYSeries::pen() const | ||||
Michal Klocek
|
r480 | \brief Returns pen used to draw points for series. | ||
Michal Klocek
|
r466 | \sa setPen() | ||
*/ | ||||
Michal Klocek
|
r480 | /*! | ||
\fn QBrush QXYSeries::brush() const | ||||
\brief Returns brush used to draw points for series. | ||||
\sa setBrush() | ||||
*/ | ||||
Tero Ahola
|
r1481 | /*! | ||
\property QXYSeries::color | ||||
Tero Ahola
|
r1491 | The color of the series. This is line (pen) color in case of QLineSeries or QSplineSeries and | ||
fill (brush) color in case of QScatterSeries or QAreaSeries. | ||||
Miikka Heikkinen
|
r2805 | \sa pen(), brush() | ||
Tero Ahola
|
r1491 | */ | ||
/*! | ||||
\qmlproperty color XYSeries::color | ||||
The color of the series. This is line (pen) color in case of LineSeries or SplineSeries and | ||||
fill (brush) color in case of ScatterSeries or AreaSeries. | ||||
Tero Ahola
|
r1481 | */ | ||
Titta Heikkala
|
r2689 | /*! | ||
\property QXYSeries::pointLabelsFormat | ||||
The \a format used for showing labels with series points. | ||||
QXYSeries supports the following format tags: | ||||
\table | ||||
\row | ||||
\li @xPoint \li The x value of the data point | ||||
\row | ||||
\li @yPoint \li The y value of the data point | ||||
\endtable | ||||
For example, the following usage of the format tags would produce labels that have the data | ||||
point (x, y) shown inside brackets separated by a comma: | ||||
\code | ||||
series->setPointLabelsFormat("(@xPoint, @yPoint)"); | ||||
\endcode | ||||
By default, the labels format is set to '@xPoint, @yPoint'. The labels are shown on the plot | ||||
area, labels on the edge of the plot area are cut. If the points are close to each other the | ||||
labels may overlap. | ||||
Miikka Heikkinen
|
r2805 | \sa pointLabelsVisible, pointLabelsFont, pointLabelsColor | ||
Titta Heikkala
|
r2689 | */ | ||
/*! | ||||
\qmlproperty string XYSeries::pointLabelsFormat | ||||
The \a format used for showing labels with series points. | ||||
Miikka Heikkinen
|
r2805 | \sa pointLabelsFormat, pointLabelsVisible, pointLabelsFont, pointLabelsColor | ||
Titta Heikkala
|
r2689 | */ | ||
/*! | ||||
\fn void QXYSeries::pointLabelsFormatChanged(const QString &format) | ||||
Signal is emitted when the \a format of data point labels is changed. | ||||
*/ | ||||
/*! | ||||
\qmlsignal XYSeries::onPointLabelsFormatChanged(string format) | ||||
Signal is emitted when the \a format of data point labels is changed. | ||||
*/ | ||||
/*! | ||||
\property QXYSeries::pointLabelsVisible | ||||
Defines the visibility for data point labels. False by default. | ||||
Titta Heikkala
|
r2815 | \sa pointLabelsFormat, pointLabelsClipping | ||
Titta Heikkala
|
r2689 | */ | ||
/*! | ||||
\qmlproperty bool XYSeries::pointLabelsVisible | ||||
Defines the visibility for data point labels. | ||||
Titta Heikkala
|
r2815 | \sa pointLabelsFormat, pointLabelsClipping | ||
Titta Heikkala
|
r2689 | */ | ||
/*! | ||||
\fn void QXYSeries::pointLabelsVisibilityChanged(bool visible) | ||||
The visibility of the data point labels is changed to \a visible. | ||||
*/ | ||||
/*! | ||||
\qmlsignal XYSeries::onPointLabelsVisibilityChanged(bool visible) | ||||
The visibility of the data point labels is changed to \a visible. | ||||
*/ | ||||
/*! | ||||
\property QXYSeries::pointLabelsFont | ||||
Defines the font used for data point labels. | ||||
Miikka Heikkinen
|
r2805 | \sa pointLabelsFormat | ||
Titta Heikkala
|
r2689 | */ | ||
/*! | ||||
\qmlproperty font XYSeries::pointLabelsFont | ||||
Defines the font used for data point labels. | ||||
\sa pointLabelsFormat | ||||
*/ | ||||
/*! | ||||
\fn void QXYSeries::pointLabelsFontChanged(const QFont &font); | ||||
The font used for data point labels is changed to \a font. | ||||
*/ | ||||
/*! | ||||
\qmlsignal XYSeries::onPointLabelsFontChanged(Font font) | ||||
The font used for data point labels is changed to \a font. | ||||
*/ | ||||
/*! | ||||
\property QXYSeries::pointLabelsColor | ||||
Defines the color used for data point labels. By default, the color is the color of the brush | ||||
defined in theme for labels. | ||||
Miikka Heikkinen
|
r2805 | \sa pointLabelsFormat | ||
Titta Heikkala
|
r2689 | */ | ||
/*! | ||||
\qmlproperty font XYSeries::pointLabelsColor | ||||
Defines the color used for data point labels. By default, the color is the color of the brush | ||||
defined in theme for labels. | ||||
\sa pointLabelsFormat | ||||
*/ | ||||
/*! | ||||
\fn void QXYSeries::pointLabelsColorChanged(const QColor &color); | ||||
The color used for data point labels is changed to \a color. | ||||
*/ | ||||
/*! | ||||
\qmlsignal XYSeries::onPointLabelsColorChanged(Color color) | ||||
The color used for data point labels is changed to \a color. | ||||
*/ | ||||
Titta Heikkala
|
r2815 | /*! | ||
\property QXYSeries::pointLabelsClipping | ||||
Defines the clipping for data point labels. True by default. The labels on the edge of the plot | ||||
area are cut when clipping is enabled. | ||||
\sa pointLabelsVisible | ||||
*/ | ||||
/*! | ||||
\qmlproperty bool XYSeries::pointLabelsClipping | ||||
Defines the clipping for data point labels. True by default. The labels on the edge of the plot | ||||
area are cut when clipping is enabled. | ||||
\sa pointLabelsVisible | ||||
*/ | ||||
/*! | ||||
Miikka Heikkinen
|
r2820 | \fn void QXYSeries::pointLabelsClippingChanged(bool clipping) | ||
Titta Heikkala
|
r2815 | The clipping of the data point labels is changed to \a clipping. | ||
*/ | ||||
/*! | ||||
\qmlsignal XYSeries::onPointLabelsClippingChanged(bool clipping) | ||||
The clipping of the data point labels is changed to \a clipping. | ||||
*/ | ||||
Michal Klocek
|
r574 | /*! | ||
\fn void QXYSeries::clicked(const QPointF& point) | ||||
Titta Heikkala
|
r2746 | \brief Signal is emitted when user clicks the \a point on chart. The \a point is the point | ||
where the press was triggered. | ||||
\sa pressed, released, doubleClicked | ||||
Michal Klocek
|
r574 | */ | ||
Tero Ahola
|
r1491 | /*! | ||
\qmlsignal XYSeries::onClicked(QPointF point) | ||||
Titta Heikkala
|
r2746 | Signal is emitted when user clicks the \a point on chart. The \a point is the point where the | ||
press was triggered. For example: | ||||
Tero Ahola
|
r1491 | \code | ||
LineSeries { | ||||
Tero Ahola
|
r1532 | XYPoint { x: 0; y: 0 } | ||
XYPoint { x: 1.1; y: 2.1 } | ||||
Tero Ahola
|
r1491 | onClicked: console.log("onClicked: " + point.x + ", " + point.y); | ||
} | ||||
\endcode | ||||
Titta Heikkala
|
r2746 | \sa onPressed, onReleased, onDoubleClicked | ||
Tero Ahola
|
r1491 | */ | ||
Michal Klocek
|
r574 | |||
Tero Ahola
|
r2362 | /*! | ||
\fn void QXYSeries::hovered(const QPointF &point, bool state) | ||||
This signal is emitted when user has hovered over or away from the series. \a point shows the origin (coordinate) | ||||
of the hover event. \a state is true when user has hovered over the series and false when hover has moved away from | ||||
the series. | ||||
*/ | ||||
/*! | ||||
\qmlsignal XYSeries::onHovered(point point, bool state) | ||||
This signal is emitted when user has hovered over or away from the series. \a point shows the origin (coordinate) | ||||
of the hover event. \a state is true when user has hovered over the series and false when hover has moved away from | ||||
the series. | ||||
*/ | ||||
Titta Heikkala
|
r2739 | /*! | ||
\fn void QXYSeries::pressed(const QPointF& point) | ||||
\brief Signal is emitted when user presses the \a point on chart. | ||||
Titta Heikkala
|
r2746 | \sa clicked, released, doubleClicked | ||
Titta Heikkala
|
r2739 | */ | ||
/*! | ||||
\qmlsignal XYSeries::onPressed(QPointF point) | ||||
Signal is emitted when user presses the \a point on chart. For example: | ||||
\code | ||||
LineSeries { | ||||
XYPoint { x: 0; y: 0 } | ||||
XYPoint { x: 1.1; y: 2.1 } | ||||
onPressed: console.log("onPressed: " + point.x + ", " + point.y); | ||||
} | ||||
\endcode | ||||
Titta Heikkala
|
r2746 | \sa onClicked, onReleased, onDoubleClicked | ||
Titta Heikkala
|
r2739 | */ | ||
/*! | ||||
\fn void QXYSeries::released(const QPointF& point) | ||||
Titta Heikkala
|
r2746 | \brief Signal is emitted when user releases a press that was triggered on a \a point on chart. | ||
\sa pressed, clicked, doubleClicked | ||||
Titta Heikkala
|
r2739 | */ | ||
/*! | ||||
\qmlsignal XYSeries::onReleased(QPointF point) | ||||
Titta Heikkala
|
r2746 | Signal is emitted when user releases a press that was triggered on a \a point on chart. | ||
For example: | ||||
Titta Heikkala
|
r2739 | \code | ||
LineSeries { | ||||
XYPoint { x: 0; y: 0 } | ||||
XYPoint { x: 1.1; y: 2.1 } | ||||
onReleased: console.log("onReleased: " + point.x + ", " + point.y); | ||||
} | ||||
\endcode | ||||
Titta Heikkala
|
r2746 | \sa onPressed, onClicked, onDoubleClicked | ||
Titta Heikkala
|
r2739 | */ | ||
/*! | ||||
\fn void QXYSeries::doubleClicked(const QPointF& point) | ||||
Titta Heikkala
|
r2746 | \brief Signal is emitted when user doubleclicks the \a point on chart. The \a point is the | ||
point where the first press was triggered. | ||||
\sa pressed, released, clicked | ||||
Titta Heikkala
|
r2739 | */ | ||
/*! | ||||
\qmlsignal XYSeries::onDoubleClicked(QPointF point) | ||||
Titta Heikkala
|
r2746 | Signal is emitted when user doubleclicks the \a point on chart. The \a point is the point where | ||
the first press was triggered. For example: | ||||
Titta Heikkala
|
r2739 | \code | ||
LineSeries { | ||||
XYPoint { x: 0; y: 0 } | ||||
XYPoint { x: 1.1; y: 2.1 } | ||||
onDoubleClicked: console.log("onDoubleClicked: " + point.x + ", " + point.y); | ||||
} | ||||
\endcode | ||||
Titta Heikkala
|
r2746 | \sa onPressed, onReleased, onClicked | ||
Titta Heikkala
|
r2739 | */ | ||
Michal Klocek
|
r466 | /*! | ||
Jani Honkonen
|
r1336 | \fn void QXYSeries::pointReplaced(int index) | ||
Tero Ahola
|
r1491 | Signal is emitted when a point has been replaced at \a index. | ||
Jani Honkonen
|
r1336 | \sa replace() | ||
Michal Klocek
|
r466 | */ | ||
Tero Ahola
|
r1491 | /*! | ||
Tero Ahola
|
r1531 | \qmlsignal XYSeries::onPointReplaced(int index) | ||
Tero Ahola
|
r1491 | Signal is emitted when a point has been replaced at \a index. | ||
*/ | ||||
Michal Klocek
|
r466 | |||
Tero Ahola
|
r1783 | /*! | ||
\fn void QXYSeries::pointsReplaced() | ||||
Miikka Heikkinen
|
r2494 | Signal is emitted when all points have been replaced with other points. | ||
Tero Ahola
|
r1783 | \sa replace() | ||
*/ | ||||
/*! | ||||
\qmlsignal XYSeries::onPointsReplaced() | ||||
Caroline Chao
|
r2770 | Signal is emitted when all points have been replaced with other points. | ||
Tero Ahola
|
r1783 | */ | ||
Michal Klocek
|
r466 | /*! | ||
Jani Honkonen
|
r1336 | \fn void QXYSeries::pointAdded(int index) | ||
Tero Ahola
|
r1491 | Signal is emitted when a point has been added at \a index. | ||
Jani Honkonen
|
r1336 | \sa append(), insert() | ||
Michal Klocek
|
r466 | */ | ||
Tero Ahola
|
r1491 | /*! | ||
Tero Ahola
|
r1531 | \qmlsignal XYSeries::onPointAdded(int index) | ||
Tero Ahola
|
r1491 | Signal is emitted when a point has been added at \a index. | ||
*/ | ||||
Michal Klocek
|
r466 | |||
/*! | ||||
Jani Honkonen
|
r1336 | \fn void QXYSeries::pointRemoved(int index) | ||
Tero Ahola
|
r1491 | Signal is emitted when a point has been removed from \a index. | ||
Jani Honkonen
|
r1336 | \sa remove() | ||
Michal Klocek
|
r466 | */ | ||
Titta Heikkala
|
r2739 | |||
Tero Ahola
|
r1491 | /*! | ||
Tero Ahola
|
r1531 | \qmlsignal XYSeries::onPointRemoved(int index) | ||
Tero Ahola
|
r1491 | Signal is emitted when a point has been removed from \a index. | ||
*/ | ||||
Michal Klocek
|
r466 | |||
Miikka Heikkinen
|
r2805 | /*! | ||
\fn void QXYSeries::pointsRemoved(int index, int count) | ||||
Signal is emitted when a \a count of points has been removed starting at \a index. | ||||
\sa removePoints(), clear() | ||||
*/ | ||||
/*! | ||||
\qmlsignal XYSeries::onPointsRemoved(int index, int count) | ||||
Signal is emitted when a \a count of points has been removed starting at \a index. | ||||
*/ | ||||
Tero Ahola
|
r1465 | /*! | ||
Tero Ahola
|
r1481 | \fn void QXYSeries::colorChanged(QColor color) | ||
\brief Signal is emitted when the line (pen) color has changed to \a color. | ||||
Tero Ahola
|
r1465 | */ | ||
Tero Ahola
|
r1491 | /*! | ||
Tero Ahola
|
r1531 | \qmlsignal XYSeries::onColorChanged(color color) | ||
Tero Ahola
|
r1491 | Signal is emitted when the line (pen) color has changed to \a color. | ||
*/ | ||||
Tero Ahola
|
r1465 | |||
Miikka Heikkinen
|
r2820 | /*! | ||
\fn void QXYSeries::penChanged(const QPen &pen) | ||||
\brief Signal is emitted when the line pen has changed to \a pen. | ||||
*/ | ||||
Michal Klocek
|
r466 | /*! | ||
Marek Rosa
|
r940 | \fn void QXYSeriesPrivate::updated() | ||
Michal Klocek
|
r466 | \brief \internal | ||
*/ | ||||
Tero Ahola
|
r1491 | /*! | ||
Tero Ahola
|
r1521 | \qmlmethod XYSeries::append(real x, real y) | ||
Append point (\a x, \a y) to the series | ||||
*/ | ||||
/*! | ||||
\qmlmethod XYSeries::replace(real oldX, real oldY, real newX, real newY) | ||||
Replaces point (\a oldX, \a oldY) with point (\a newX, \a newY). Does nothing, if point (oldX, oldY) does not | ||||
exist. | ||||
*/ | ||||
/*! | ||||
\qmlmethod XYSeries::remove(real x, real y) | ||||
Removes point (\a x, \a y) from the series. Does nothing, if point (x, y) does not exist. | ||||
*/ | ||||
Miikka Heikkinen
|
r2805 | /*! | ||
\qmlmethod XYSeries::remove(int index) | ||||
Removes a point from the series at \a index. | ||||
*/ | ||||
/*! | ||||
\qmlmethod XYSeries::removePoints(int index, int count) | ||||
Removes \a count points from the series starting at \a index. | ||||
*/ | ||||
Tero Ahola
|
r1521 | /*! | ||
\qmlmethod XYSeries::insert(int index, real x, real y) | ||||
Inserts point (\a x, \a y) to the \a index. If index is 0 or smaller than 0 the point is prepended to the list of | ||||
points. If index is the same as or bigger than count, the point is appended to the list of points. | ||||
*/ | ||||
/*! | ||||
\qmlmethod QPointF XYSeries::at(int index) | ||||
Returns point at \a index. Returns (0, 0) if the index is not valid. | ||||
Tero Ahola
|
r1491 | */ | ||
Michal Klocek
|
r466 | /*! | ||
Tero Ahola
|
r973 | \internal | ||
Michal Klocek
|
r466 | Constructs empty series object which is a child of \a parent. | ||
Miikka Heikkinen
|
r2494 | When series object is added to QChart instance ownerships is transferred. | ||
Michal Klocek
|
r466 | */ | ||
Jani Honkonen
|
r2097 | QXYSeries::QXYSeries(QXYSeriesPrivate &d, QObject *parent) | ||
: QAbstractSeries(d, parent) | ||||
Michal Klocek
|
r938 | { | ||
Michal Klocek
|
r466 | } | ||
Tero Ahola
|
r1342 | |||
Michal Klocek
|
r466 | /*! | ||
Miikka Heikkinen
|
r2494 | Destroys the object. Series added to QChart instances are owned by those, | ||
and are destroyed when QChart instances are destroyed. | ||||
Michal Klocek
|
r466 | */ | ||
QXYSeries::~QXYSeries() | ||||
{ | ||||
} | ||||
/*! | ||||
Miikka Heikkinen
|
r2494 | Adds data point (\a x, \a y) to the series. | ||
Michal Klocek
|
r466 | */ | ||
Jani Honkonen
|
r2097 | void QXYSeries::append(qreal x, qreal y) | ||
Michal Klocek
|
r466 | { | ||
Jani Honkonen
|
r2097 | append(QPointF(x, y)); | ||
Michal Klocek
|
r466 | } | ||
/*! | ||||
This is an overloaded function. | ||||
Miikka Heikkinen
|
r2494 | Adds data \a point to the series. | ||
Michal Klocek
|
r466 | */ | ||
Jani Honkonen
|
r796 | void QXYSeries::append(const QPointF &point) | ||
Michal Klocek
|
r466 | { | ||
Michal Klocek
|
r1057 | Q_D(QXYSeries); | ||
Mika Salmela
|
r2424 | |||
if (isValidValue(point)) { | ||||
d->m_points << point; | ||||
emit pointAdded(d->m_points.count() - 1); | ||||
} | ||||
Michal Klocek
|
r466 | } | ||
Michal Klocek
|
r481 | /*! | ||
This is an overloaded function. | ||||
Miikka Heikkinen
|
r2494 | Adds list of data \a points to the series. | ||
Michal Klocek
|
r481 | */ | ||
Michal Klocek
|
r1057 | void QXYSeries::append(const QList<QPointF> &points) | ||
Michal Klocek
|
r481 | { | ||
Jani Honkonen
|
r2097 | foreach (const QPointF &point , points) | ||
Michal Klocek
|
r1057 | append(point); | ||
Michal Klocek
|
r481 | } | ||
Jani Honkonen
|
r1336 | /*! | ||
Miikka Heikkinen
|
r2494 | Replaces data point (\a oldX, \a oldY) with data point (\a newX, \a newY). | ||
Miikka Heikkinen
|
r2805 | \sa pointReplaced() | ||
Jani Honkonen
|
r1336 | */ | ||
Jani Honkonen
|
r2097 | void QXYSeries::replace(qreal oldX, qreal oldY, qreal newX, qreal newY) | ||
Michal Klocek
|
r466 | { | ||
Jani Honkonen
|
r2097 | replace(QPointF(oldX, oldY), QPointF(newX, newY)); | ||
Michal Klocek
|
r466 | } | ||
Jani Honkonen
|
r1336 | /*! | ||
Replaces \a oldPoint with \a newPoint. | ||||
Miikka Heikkinen
|
r2805 | \sa pointReplaced() | ||
Jani Honkonen
|
r1336 | */ | ||
Jani Honkonen
|
r2097 | void QXYSeries::replace(const QPointF &oldPoint, const QPointF &newPoint) | ||
Michal Klocek
|
r622 | { | ||
Michal Klocek
|
r938 | Q_D(QXYSeries); | ||
Michal Klocek
|
r1057 | int index = d->m_points.indexOf(oldPoint); | ||
Jani Honkonen
|
r2097 | if (index == -1) | ||
return; | ||||
Miikka Heikkinen
|
r2496 | replace(index, newPoint); | ||
} | ||||
Miikka Heikkinen
|
r2503 | /*! | ||
Replaces the point at \a index with data point (\a newX, \a newY). | ||||
Miikka Heikkinen
|
r2805 | \sa pointReplaced() | ||
Miikka Heikkinen
|
r2503 | */ | ||
Miikka Heikkinen
|
r2496 | void QXYSeries::replace(int index, qreal newX, qreal newY) | ||
{ | ||||
replace(index, QPointF(newX, newY)); | ||||
} | ||||
Miikka Heikkinen
|
r2503 | /*! | ||
Replaces the point at \a index with \a newPoint. | ||||
Miikka Heikkinen
|
r2805 | \sa pointReplaced() | ||
Miikka Heikkinen
|
r2503 | */ | ||
Miikka Heikkinen
|
r2496 | void QXYSeries::replace(int index, const QPointF &newPoint) | ||
{ | ||||
Q_D(QXYSeries); | ||||
Mika Salmela
|
r2424 | if (isValidValue(newPoint)) { | ||
d->m_points[index] = newPoint; | ||||
emit pointReplaced(index); | ||||
} | ||||
Michal Klocek
|
r622 | } | ||
Tero Ahola
|
r1783 | /*! | ||
Miikka Heikkinen
|
r2494 | Replaces the current points with \a points. | ||
\note This is much faster than replacing data points one by one, | ||||
Tero Ahola
|
r1783 | or first clearing all data, and then appending the new data. Emits QXYSeries::pointsReplaced() | ||
Miikka Heikkinen
|
r2798 | when the points have been replaced. However, note that using the overload that takes | ||
Miikka Heikkinen
|
r2820 | \c{QVector<QPointF>} as parameter is faster than using this overload. | ||
Miikka Heikkinen
|
r2805 | \sa pointsReplaced() | ||
Tero Ahola
|
r1783 | */ | ||
void QXYSeries::replace(QList<QPointF> points) | ||||
Miikka Heikkinen
|
r2798 | { | ||
replace(points.toVector()); | ||||
} | ||||
/*! | ||||
Replaces the current points with \a points. | ||||
\note This is much faster than replacing data points one by one, | ||||
or first clearing all data, and then appending the new data. Emits QXYSeries::pointsReplaced() | ||||
when the points have been replaced. | ||||
Miikka Heikkinen
|
r2805 | \sa pointsReplaced() | ||
Miikka Heikkinen
|
r2798 | */ | ||
void QXYSeries::replace(QVector<QPointF> points) | ||||
Tero Ahola
|
r1783 | { | ||
Q_D(QXYSeries); | ||||
Miikka Heikkinen
|
r2798 | d->m_points = points; | ||
Tero Ahola
|
r1783 | emit pointsReplaced(); | ||
} | ||||
Michal Klocek
|
r466 | /*! | ||
Miikka Heikkinen
|
r2494 | Removes the point (\a x, \a y) from the series. | ||
Miikka Heikkinen
|
r2805 | \sa pointRemoved() | ||
Michal Klocek
|
r466 | */ | ||
Jani Honkonen
|
r2097 | void QXYSeries::remove(qreal x, qreal y) | ||
Michal Klocek
|
r466 | { | ||
Jani Honkonen
|
r2097 | remove(QPointF(x, y)); | ||
Michal Klocek
|
r466 | } | ||
/*! | ||||
Miikka Heikkinen
|
r2494 | Removes the \a point from the series. | ||
Miikka Heikkinen
|
r2805 | \sa pointRemoved() | ||
Michal Klocek
|
r466 | */ | ||
sauimone
|
r743 | void QXYSeries::remove(const QPointF &point) | ||
Michal Klocek
|
r466 | { | ||
Michal Klocek
|
r1057 | Q_D(QXYSeries); | ||
int index = d->m_points.indexOf(point); | ||||
Jani Honkonen
|
r2097 | if (index == -1) | ||
return; | ||||
Miikka Heikkinen
|
r2496 | remove(index); | ||
} | ||||
Miikka Heikkinen
|
r2503 | /*! | ||
Removes the point at \a index from the series. | ||||
Miikka Heikkinen
|
r2805 | \sa pointRemoved() | ||
Miikka Heikkinen
|
r2503 | */ | ||
Miikka Heikkinen
|
r2496 | void QXYSeries::remove(int index) | ||
{ | ||||
Q_D(QXYSeries); | ||||
Michal Klocek
|
r1057 | d->m_points.remove(index); | ||
Marek Rosa
|
r1262 | emit pointRemoved(index); | ||
Michal Klocek
|
r466 | } | ||
Miikka Heikkinen
|
r2805 | /*! | ||
Removes \a count number of points from the series starting at \a index. | ||||
\sa pointsRemoved() | ||||
*/ | ||||
void QXYSeries::removePoints(int index, int count) | ||||
{ | ||||
// This function doesn't overload remove as there is chance for it to get mixed up with | ||||
// remove(qreal, qreal) overload in some implicit casting cases. | ||||
Q_D(QXYSeries); | ||||
if (count > 0) { | ||||
d->m_points.remove(index, count); | ||||
emit pointsRemoved(index, count); | ||||
} | ||||
} | ||||
Jani Honkonen
|
r1336 | /*! | ||
Inserts a \a point in the series at \a index position. | ||||
Miikka Heikkinen
|
r2805 | \sa pointAdded() | ||
Jani Honkonen
|
r1336 | */ | ||
Marek Rosa
|
r1256 | void QXYSeries::insert(int index, const QPointF &point) | ||
{ | ||||
Q_D(QXYSeries); | ||||
Mika Salmela
|
r2424 | if (isValidValue(point)) { | ||
Friedemann Kleint
|
r2772 | index = qMax(0, qMin(index, d->m_points.size())); | ||
Mika Salmela
|
r2424 | d->m_points.insert(index, point); | ||
emit pointAdded(index); | ||||
} | ||||
Marek Rosa
|
r1256 | } | ||
Jani Honkonen
|
r1336 | /*! | ||
Miikka Heikkinen
|
r2805 | Removes all points from the series. | ||
\sa pointsRemoved() | ||||
Jani Honkonen
|
r1336 | */ | ||
Marek Rosa
|
r1256 | void QXYSeries::clear() | ||
{ | ||||
Q_D(QXYSeries); | ||||
Miikka Heikkinen
|
r2805 | removePoints(0, d->m_points.size()); | ||
Marek Rosa
|
r1256 | } | ||
Michal Klocek
|
r466 | /*! | ||
Miikka Heikkinen
|
r2820 | Returns the points in the series as a list. | ||
Use QXYSeries::pointsVector() for better performance. | ||||
Michal Klocek
|
r466 | */ | ||
Michal Klocek
|
r1057 | QList<QPointF> QXYSeries::points() const | ||
Michal Klocek
|
r466 | { | ||
Michal Klocek
|
r938 | Q_D(const QXYSeries); | ||
Marek Rosa
|
r1230 | return d->m_points.toList(); | ||
Michal Klocek
|
r466 | } | ||
Miikka Heikkinen
|
r2820 | /*! | ||
Returns the points in the series as a vector. | ||||
This is more efficient that calling QXYSeries::points(); | ||||
*/ | ||||
QVector<QPointF> QXYSeries::pointsVector() const | ||||
{ | ||||
Q_D(const QXYSeries); | ||||
return d->m_points; | ||||
} | ||||
Miikka Heikkinen
|
r2483 | /*! | ||
Returns point at \a index in internal points vector. | ||||
*/ | ||||
Miikka Heikkinen
|
r2491 | const QPointF &QXYSeries::at(int index) const | ||
Miikka Heikkinen
|
r2483 | { | ||
Q_D(const QXYSeries); | ||||
return d->m_points.at(index); | ||||
} | ||||
Michal Klocek
|
r466 | /*! | ||
Returns number of data points within series. | ||||
*/ | ||||
int QXYSeries::count() const | ||||
{ | ||||
Michal Klocek
|
r938 | Q_D(const QXYSeries); | ||
Michal Klocek
|
r1057 | return d->m_points.count(); | ||
Tero Ahola
|
r491 | } | ||
Michal Klocek
|
r467 | /*! | ||
Michal Klocek
|
r481 | Sets \a pen used for drawing points on the chart. If the pen is not defined, the | ||
pen from chart theme is used. | ||||
Marek Rosa
|
r909 | \sa QChart::setTheme() | ||
Michal Klocek
|
r467 | */ | ||
sauimone
|
r743 | void QXYSeries::setPen(const QPen &pen) | ||
Michal Klocek
|
r467 | { | ||
Michal Klocek
|
r938 | Q_D(QXYSeries); | ||
Tero Ahola
|
r1537 | if (d->m_pen != pen) { | ||
bool emitColorChanged = d->m_pen.color() != pen.color(); | ||||
Michal Klocek
|
r938 | d->m_pen = pen; | ||
emit d->updated(); | ||||
Tero Ahola
|
r1537 | if (emitColorChanged) | ||
emit colorChanged(pen.color()); | ||||
Miikka Heikkinen
|
r2820 | emit penChanged(pen); | ||
Michal Klocek
|
r467 | } | ||
} | ||||
Michal Klocek
|
r938 | QPen QXYSeries::pen() const | ||
{ | ||||
Q_D(const QXYSeries); | ||||
Miikka Heikkinen
|
r2519 | if (d->m_pen == QChartPrivate::defaultPen()) | ||
return QPen(); | ||||
else | ||||
return d->m_pen; | ||||
Michal Klocek
|
r938 | } | ||
Michal Klocek
|
r467 | /*! | ||
Michal Klocek
|
r481 | Sets \a brush used for drawing points on the chart. If the brush is not defined, brush | ||
from chart theme setting is used. | ||||
Marek Rosa
|
r909 | \sa QChart::setTheme() | ||
Michal Klocek
|
r467 | */ | ||
sauimone
|
r743 | void QXYSeries::setBrush(const QBrush &brush) | ||
Michal Klocek
|
r467 | { | ||
Michal Klocek
|
r938 | Q_D(QXYSeries); | ||
Jani Honkonen
|
r2097 | if (d->m_brush != brush) { | ||
Michal Klocek
|
r938 | d->m_brush = brush; | ||
emit d->updated(); | ||||
Michal Klocek
|
r467 | } | ||
} | ||||
Michal Klocek
|
r938 | QBrush QXYSeries::brush() const | ||
{ | ||||
Q_D(const QXYSeries); | ||||
Miikka Heikkinen
|
r2519 | if (d->m_brush == QChartPrivate::defaultBrush()) | ||
return QBrush(); | ||||
else | ||||
return d->m_brush; | ||||
Michal Klocek
|
r938 | } | ||
Tero Ahola
|
r1481 | void QXYSeries::setColor(const QColor &color) | ||
{ | ||||
QPen p = pen(); | ||||
if (p.color() != color) { | ||||
p.setColor(color); | ||||
setPen(p); | ||||
} | ||||
} | ||||
QColor QXYSeries::color() const | ||||
{ | ||||
return pen().color(); | ||||
} | ||||
Michal Klocek
|
r938 | |||
void QXYSeries::setPointsVisible(bool visible) | ||||
{ | ||||
Q_D(QXYSeries); | ||||
Jani Honkonen
|
r2097 | if (d->m_pointsVisible != visible) { | ||
Michal Klocek
|
r938 | d->m_pointsVisible = visible; | ||
emit d->updated(); | ||||
} | ||||
} | ||||
bool QXYSeries::pointsVisible() const | ||||
{ | ||||
Q_D(const QXYSeries); | ||||
return d->m_pointsVisible; | ||||
} | ||||
Titta Heikkala
|
r2689 | void QXYSeries::setPointLabelsFormat(const QString &format) | ||
{ | ||||
Q_D(QXYSeries); | ||||
if (d->m_pointLabelsFormat != format) { | ||||
d->m_pointLabelsFormat = format; | ||||
emit pointLabelsFormatChanged(format); | ||||
} | ||||
} | ||||
QString QXYSeries::pointLabelsFormat() const | ||||
{ | ||||
Q_D(const QXYSeries); | ||||
return d->m_pointLabelsFormat; | ||||
} | ||||
void QXYSeries::setPointLabelsVisible(bool visible) | ||||
{ | ||||
Q_D(QXYSeries); | ||||
if (d->m_pointLabelsVisible != visible) { | ||||
d->m_pointLabelsVisible = visible; | ||||
emit pointLabelsVisibilityChanged(visible); | ||||
} | ||||
} | ||||
bool QXYSeries::pointLabelsVisible() const | ||||
{ | ||||
Q_D(const QXYSeries); | ||||
return d->m_pointLabelsVisible; | ||||
} | ||||
void QXYSeries::setPointLabelsFont(const QFont &font) | ||||
{ | ||||
Q_D(QXYSeries); | ||||
if (d->m_pointLabelsFont != font) { | ||||
d->m_pointLabelsFont = font; | ||||
emit pointLabelsFontChanged(font); | ||||
} | ||||
} | ||||
QFont QXYSeries::pointLabelsFont() const | ||||
{ | ||||
Q_D(const QXYSeries); | ||||
return d->m_pointLabelsFont; | ||||
} | ||||
void QXYSeries::setPointLabelsColor(const QColor &color) | ||||
{ | ||||
Q_D(QXYSeries); | ||||
if (d->m_pointLabelsColor != color) { | ||||
d->m_pointLabelsColor = color; | ||||
emit pointLabelsColorChanged(color); | ||||
} | ||||
} | ||||
QColor QXYSeries::pointLabelsColor() const | ||||
{ | ||||
Q_D(const QXYSeries); | ||||
if (d->m_pointLabelsColor == QChartPrivate::defaultPen().color()) | ||||
return QPen().color(); | ||||
else | ||||
return d->m_pointLabelsColor; | ||||
} | ||||
Michal Klocek
|
r467 | |||
Titta Heikkala
|
r2815 | void QXYSeries::setPointLabelsClipping(bool enabled) | ||
{ | ||||
Q_D(QXYSeries); | ||||
if (d->m_pointLabelsClipping != enabled) { | ||||
d->m_pointLabelsClipping = enabled; | ||||
emit pointLabelsClippingChanged(enabled); | ||||
} | ||||
} | ||||
bool QXYSeries::pointLabelsClipping() const | ||||
{ | ||||
Q_D(const QXYSeries); | ||||
return d->m_pointLabelsClipping; | ||||
} | ||||
Michal Klocek
|
r466 | /*! | ||
Stream operator for adding a data \a point to the series. | ||||
Jani Honkonen
|
r796 | \sa append() | ||
Michal Klocek
|
r466 | */ | ||
Jani Honkonen
|
r2104 | QXYSeries &QXYSeries::operator<< (const QPointF &point) | ||
Michal Klocek
|
r466 | { | ||
Jani Honkonen
|
r796 | append(point); | ||
Michal Klocek
|
r466 | return *this; | ||
} | ||||
Michal Klocek
|
r481 | /*! | ||
Stream operator for adding a list of \a points to the series. | ||||
Jani Honkonen
|
r796 | \sa append() | ||
Michal Klocek
|
r481 | */ | ||
Jani Honkonen
|
r2104 | QXYSeries &QXYSeries::operator<< (const QList<QPointF>& points) | ||
Michal Klocek
|
r481 | { | ||
Jani Honkonen
|
r796 | append(points); | ||
Michal Klocek
|
r481 | return *this; | ||
} | ||||
Michal Klocek
|
r938 | ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||
Marek Rosa
|
r990 | |||
Jani Honkonen
|
r2104 | QXYSeriesPrivate::QXYSeriesPrivate(QXYSeries *q) | ||
: QAbstractSeriesPrivate(q), | ||||
Miikka Heikkinen
|
r2516 | m_pen(QChartPrivate::defaultPen()), | ||
m_brush(QChartPrivate::defaultBrush()), | ||||
Titta Heikkala
|
r2689 | m_pointsVisible(false), | ||
m_pointLabelsFormat(QLatin1String("@xPoint, @yPoint")), | ||||
m_pointLabelsVisible(false), | ||||
m_pointLabelsFont(QChartPrivate::defaultFont()), | ||||
Titta Heikkala
|
r2815 | m_pointLabelsColor(QChartPrivate::defaultPen().color()), | ||
m_pointLabelsClipping(true) | ||||
Michal Klocek
|
r938 | { | ||
} | ||||
Michal Klocek
|
r2273 | void QXYSeriesPrivate::initializeDomain() | ||
Michal Klocek
|
r943 | { | ||
Marek Rosa
|
r1740 | qreal minX(0); | ||
qreal minY(0); | ||||
qreal maxX(1); | ||||
qreal maxY(1); | ||||
Michal Klocek
|
r943 | |||
Michal Klocek
|
r1059 | Q_Q(QXYSeries); | ||
Michal Klocek
|
r1057 | |||
Miikka Heikkinen
|
r2820 | const QVector<QPointF> &points = q->pointsVector(); | ||
Michal Klocek
|
r1070 | |||
Jani Honkonen
|
r2097 | if (!points.isEmpty()) { | ||
Marek Rosa
|
r1740 | minX = points[0].x(); | ||
minY = points[0].y(); | ||||
maxX = minX; | ||||
maxY = minY; | ||||
for (int i = 0; i < points.count(); i++) { | ||||
qreal x = points[i].x(); | ||||
qreal y = points[i].y(); | ||||
minX = qMin(minX, x); | ||||
minY = qMin(minY, y); | ||||
maxX = qMax(maxX, x); | ||||
maxY = qMax(maxY, y); | ||||
} | ||||
Marek Rosa
|
r1205 | } | ||
Michal Klocek
|
r2273 | domain()->setRange(minX, maxX, minY, maxY); | ||
Michal Klocek
|
r943 | } | ||
sauimone
|
r2163 | QList<QLegendMarker*> QXYSeriesPrivate::createLegendMarkers(QLegend* legend) | ||
{ | ||||
sauimone
|
r2175 | Q_Q(QXYSeries); | ||
sauimone
|
r2163 | QList<QLegendMarker*> list; | ||
sauimone
|
r2175 | return list << new QXYLegendMarker(q,legend); | ||
sauimone
|
r2163 | } | ||
Michal Klocek
|
r2273 | void QXYSeriesPrivate::initializeAxes() | ||
Michal Klocek
|
r1556 | { | ||
Michal Klocek
|
r2273 | |||
Michal Klocek
|
r1556 | } | ||
Michal Klocek
|
r1695 | QAbstractAxis::AxisType QXYSeriesPrivate::defaultAxisType(Qt::Orientation orientation) const | ||
Michal Klocek
|
r1588 | { | ||
Michal Klocek
|
r1695 | Q_UNUSED(orientation); | ||
Marek Rosa
|
r1818 | return QAbstractAxis::AxisTypeValue; | ||
Michal Klocek
|
r1556 | } | ||
Michal Klocek
|
r2273 | QAbstractAxis* QXYSeriesPrivate::createDefaultAxis(Qt::Orientation orientation) const | ||
{ | ||||
Q_UNUSED(orientation); | ||||
Titta Heikkala
|
r2614 | return new QValueAxis; | ||
Michal Klocek
|
r2273 | } | ||
Titta Heikkala
|
r2804 | void QXYSeriesPrivate::initializeAnimations(QtCharts::QChart::AnimationOptions options, | ||
int duration, QEasingCurve &curve) | ||||
Michal Klocek
|
r2273 | { | ||
XYChart *item = static_cast<XYChart *>(m_item.data()); | ||||
Q_ASSERT(item); | ||||
Miikka Heikkinen
|
r2555 | if (item->animation()) | ||
item->animation()->stopAndDestroyLater(); | ||||
if (options.testFlag(QChart::SeriesAnimations)) | ||||
Titta Heikkala
|
r2804 | item->setAnimation(new XYAnimation(item, duration, curve)); | ||
Miikka Heikkinen
|
r2555 | else | ||
Michal Klocek
|
r2273 | item->setAnimation(0); | ||
Titta Heikkala
|
r2804 | QAbstractSeriesPrivate::initializeAnimations(options, duration, curve); | ||
Michal Klocek
|
r2273 | } | ||
Titta Heikkala
|
r2696 | void QXYSeriesPrivate::drawSeriesPointLabels(QPainter *painter, const QVector<QPointF> &points, | ||
const int offset) | ||||
Titta Heikkala
|
r2689 | { | ||
static const QString xPointTag(QLatin1String("@xPoint")); | ||||
static const QString yPointTag(QLatin1String("@yPoint")); | ||||
Titta Heikkala
|
r2696 | const int labelOffset = offset + 2; | ||
Titta Heikkala
|
r2689 | |||
painter->setFont(m_pointLabelsFont); | ||||
painter->setPen(QPen(m_pointLabelsColor)); | ||||
QFontMetrics fm(painter->font()); | ||||
Titta Heikkala
|
r2779 | // m_points is used for the label here as it has the series point information | ||
// points variable passed is used for positioning because it has the coordinates | ||||
for (int i(0); i < m_points.size(); i++) { | ||||
Titta Heikkala
|
r2689 | QString pointLabel = m_pointLabelsFormat; | ||
Titta Heikkala
|
r2779 | pointLabel.replace(xPointTag, presenter()->numberToString(m_points.at(i).x())); | ||
pointLabel.replace(yPointTag, presenter()->numberToString(m_points.at(i).y())); | ||||
Titta Heikkala
|
r2689 | |||
// Position text in relation to the point | ||||
int pointLabelWidth = fm.width(pointLabel); | ||||
QPointF position(points.at(i)); | ||||
Titta Heikkala
|
r2781 | if (!reverseXAxis()) | ||
position.setX(position.x() - pointLabelWidth / 2); | ||||
else | ||||
position.setX(domain()->size().width() - position.x() - pointLabelWidth / 2); | ||||
if (!reverseYAxis()) | ||||
position.setY(position.y() - labelOffset); | ||||
else | ||||
position.setY(domain()->size().height() - position.y() - labelOffset); | ||||
Titta Heikkala
|
r2689 | |||
painter->drawText(position, pointLabel); | ||||
} | ||||
} | ||||
Michal Klocek
|
r466 | #include "moc_qxyseries.cpp" | ||
Michal Klocek
|
r938 | #include "moc_qxyseries_p.cpp" | ||
Michal Klocek
|
r466 | |||
Titta Heikkala
|
r2712 | QT_CHARTS_END_NAMESPACE | ||