| /**************************************************************************** |
| ** |
| ** Copyright (C) 2016 The Qt Company Ltd. |
| ** Contact: https://www.qt.io/licensing/ |
| ** |
| ** This file is part of the Qt Charts module of the Qt Toolkit. |
| ** |
| ** $QT_BEGIN_LICENSE:GPL$ |
| ** 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 |
| ** 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. |
| ** |
| ** $QT_END_LICENSE$ |
| ** |
| ****************************************************************************/ |
| |
| #include <QtCharts/QBoxSet> |
| #include <private/qboxset_p.h> |
| #include <private/charthelpers_p.h> |
| |
| QT_CHARTS_BEGIN_NAMESPACE |
| |
| /*! |
| \class QBoxSet |
| \inmodule QtCharts |
| \brief The QBoxSet class represents one item in a box-and-whiskers chart. |
| |
| A box-and-whiskers item is a graphical representation of a range and three median values |
| that is constructed from five different values. There are two ways to specify the values. |
| The first one is by using a constructor or stream operator (<<). The values have to be |
| specified in the following order: lower extreme, lower quartile, median, upper quartile, |
| and upper extreme. |
| |
| The second way is to create an empty QBoxSet instance and specify the values using the |
| setValue() method. |
| |
| See the \l{Box and Whiskers Example}{box-and-whiskers chart example} to learn how to |
| create a box-and-whiskers chart. |
| |
| \sa QBoxPlotSeries |
| */ |
| /*! |
| \enum QBoxSet::ValuePositions |
| |
| This enum type defines the values of a box-and-whiskers item: |
| |
| \value LowerExtreme The smallest value of the box-and-whiskers item. |
| \value LowerQuartile The median value of the lower half of the box-and-whiskers item. |
| \value Median The median value of the box-and-whiskers item. |
| \value UpperQuartile The median value of the upper half of the box-and-whiskers item. |
| \value UpperExtreme The largest value of the box-and-whiskers item. |
| */ |
| /*! |
| \property QBoxSet::pen |
| \brief The pen used to draw the lines of the box-and-whiskers item. |
| */ |
| /*! |
| \property QBoxSet::brush |
| \brief The brush used fill the box of the box-and-whiskers item. |
| */ |
| |
| /*! |
| \fn void QBoxSet::clicked() |
| This signal is emitted when the user clicks a box-and-whiskers item in the chart. |
| */ |
| |
| /*! |
| \fn void QBoxSet::pressed() |
| This signal is emitted when the user clicks a box-and-whiskers item in the chart |
| and holds down the mouse button. |
| */ |
| |
| /*! |
| \fn void QBoxSet::released() |
| This signal is emitted when the user releases the mouse press on a box-and-whiskers item. |
| */ |
| |
| /*! |
| \fn void QBoxSet::doubleClicked() |
| This signal is emitted when the user double-clicks a box-and-whiskers item. |
| */ |
| |
| /*! |
| \fn void QBoxSet::hovered(bool status) |
| |
| This signal is emitted when a mouse is hovered over a box-and-whiskers item in a chart. |
| When the mouse moves over the item, \a status turns \c true, and when the mouse moves |
| away again, it turns \c false. |
| */ |
| /*! |
| \fn void QBoxSet::penChanged() |
| This signal is emitted when the pen of the box-and-whiskers item changes. |
| \sa pen |
| */ |
| /*! |
| \fn void QBoxSet::brushChanged() |
| This signal is emitted when the brush of the box-and-whiskers item changes. |
| \sa brush |
| */ |
| /*! |
| \fn void QBoxSet::valuesChanged() |
| This signal is emitted when multiple values of the box-and-whiskers item change. |
| \sa append() |
| */ |
| /*! |
| \fn void QBoxSet::valueChanged(int index) |
| This signal is emitted when the value of the box-and-whiskers item specified by |
| \a index is modified. |
| \sa at() |
| */ |
| /*! |
| \fn void QBoxSet::cleared() |
| This signal is emitted when all the values of the box-and-whiskers item are set to 0. |
| */ |
| |
| /*! |
| Constructs a box-and-whiskers item with the optional label \a label and parent \a parent. |
| */ |
| QBoxSet::QBoxSet(const QString label, QObject *parent) |
| : QObject(parent), |
| d_ptr(new QBoxSetPrivate(label, this)) |
| { |
| } |
| |
| /*! |
| Constructs a box-and-whiskers item with the following ordered values: \a le specifies the |
| lower extreme, \a lq the lower quartile, \a m the median, \a uq the upper quartile, and |
| \a ue the upper quartile. Optionally, the \a label and \a parent can be specified. |
| */ |
| QBoxSet::QBoxSet(const qreal le, const qreal lq, const qreal m, const qreal uq, const qreal ue, const QString label, QObject *parent) |
| : QObject(parent), |
| d_ptr(new QBoxSetPrivate(label, this)) |
| { |
| d_ptr->append(le); |
| d_ptr->append(lq); |
| d_ptr->append(m); |
| d_ptr->append(uq); |
| d_ptr->append(ue); |
| } |
| |
| /*! |
| Destroys the a box-and-whiskers item. |
| */ |
| QBoxSet::~QBoxSet() |
| { |
| } |
| |
| /*! |
| Appends the new value specified by \a value to the end of the box-and-whiskers item. |
| */ |
| void QBoxSet::append(const qreal value) |
| { |
| if (d_ptr->append(value)) |
| emit valueChanged(d_ptr->m_appendCount - 1); |
| } |
| |
| /*! |
| Appends a list of real values specified by \a values to the end of the box-and-whiskers item. |
| \sa append() |
| */ |
| void QBoxSet::append(const QList<qreal> &values) |
| { |
| if (d_ptr->append(values)) |
| emit valuesChanged(); |
| } |
| |
| /*! |
| Sets the label specified by \a label for the category of the box-and-whiskers item. |
| */ |
| void QBoxSet::setLabel(const QString label) |
| { |
| d_ptr->m_label = label; |
| } |
| |
| /*! |
| Returns the label of the category of the box-and-whiskers item. |
| */ |
| QString QBoxSet::label() const |
| { |
| return d_ptr->m_label; |
| } |
| |
| /*! |
| A convenience operator for appending the real value specified by \a value to the end |
| of the box-and-whiskers item. |
| \sa append() |
| */ |
| QBoxSet &QBoxSet::operator << (const qreal &value) |
| { |
| append(value); |
| return *this; |
| } |
| |
| /*! |
| Sets the value specified by \a value in the position specified by \a index. |
| The index can be specified by using the ValuePositions enumeration values. |
| */ |
| void QBoxSet::setValue(const int index, const qreal value) |
| { |
| d_ptr->setValue(index, value); |
| emit valueChanged(index); |
| } |
| |
| /*! |
| Sets all the values of the box-and-whiskers item to 0. |
| */ |
| void QBoxSet::clear() |
| { |
| d_ptr->clear(); |
| emit cleared(); |
| } |
| |
| /*! |
| Returns the value of the box-and-whiskers item specified by \a index. |
| The index can be specified by using ValuePositions enumeration values. |
| If the index is out of bounds, 0.0 is returned. |
| */ |
| qreal QBoxSet::at(const int index) const |
| { |
| if (index < 0 || index >= 5) |
| return 0; |
| return d_ptr->m_values[index]; |
| } |
| |
| /*! |
| Returns the value of the box-and-whiskers item specified by \a index. |
| The index can be specified by using ValuePositions enumeration values. |
| If the index is out of bounds, 0.0 is returned. |
| */ |
| qreal QBoxSet::operator [](const int index) const |
| { |
| return at(index); |
| } |
| |
| /*! |
| Returns the number of values appended to the box-and-whiskers item. |
| */ |
| int QBoxSet::count() const |
| { |
| return d_ptr->m_appendCount; |
| } |
| |
| /*! |
| Sets the pen used to draw the box-and-whiskers item to \a pen. |
| */ |
| void QBoxSet::setPen(const QPen &pen) |
| { |
| if (d_ptr->m_pen != pen) { |
| d_ptr->m_pen = pen; |
| emit d_ptr->updatedBox(); |
| emit penChanged(); |
| } |
| } |
| |
| /*! |
| Returns the pen used to draw the box-and-whiskers item. |
| */ |
| QPen QBoxSet::pen() const |
| { |
| return d_ptr->m_pen; |
| } |
| |
| /*! |
| Sets the brush used to fill the box-and-whiskers item to \a brush. |
| */ |
| void QBoxSet::setBrush(const QBrush &brush) |
| { |
| if (d_ptr->m_brush != brush) { |
| d_ptr->m_brush = brush; |
| emit d_ptr->updatedBox(); |
| emit brushChanged(); |
| } |
| } |
| |
| /*! |
| Returns the brush used to fill the box-and-whiskers item. |
| */ |
| QBrush QBoxSet::brush() const |
| { |
| return d_ptr->m_brush; |
| } |
| |
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
| |
| QBoxSetPrivate::QBoxSetPrivate(const QString label, QBoxSet *parent) : QObject(parent), |
| q_ptr(parent), |
| m_label(label), |
| m_valuesCount(5), |
| m_appendCount(0), |
| m_pen(QPen(Qt::NoPen)), |
| m_brush(QBrush(Qt::NoBrush)), |
| m_series(0) |
| { |
| m_values = new qreal[m_valuesCount]; |
| } |
| |
| QBoxSetPrivate::~QBoxSetPrivate() |
| { |
| delete[] m_values; |
| } |
| |
| bool QBoxSetPrivate::append(qreal value) |
| { |
| if (isValidValue(value) && m_appendCount < m_valuesCount) { |
| m_values[m_appendCount++] = value; |
| emit restructuredBox(); |
| |
| return true; |
| } |
| return false; |
| } |
| |
| bool QBoxSetPrivate::append(QList<qreal> values) |
| { |
| bool success = false; |
| |
| for (int i = 0; i < values.count(); i++) { |
| if (isValidValue(values.at(i)) && m_appendCount < m_valuesCount) { |
| success = true; |
| m_values[m_appendCount++] = values.at(i); |
| } |
| } |
| |
| if (success) |
| emit restructuredBox(); |
| |
| return success; |
| } |
| |
| void QBoxSetPrivate::clear() |
| { |
| m_appendCount = 0; |
| for (int i = 0; i < m_valuesCount; i++) { |
| m_values[i] = 0.0; |
| } |
| emit restructuredBox(); |
| } |
| |
| void QBoxSetPrivate::setValue(const int index, const qreal value) |
| { |
| if (index < m_valuesCount) { |
| m_values[index] = value; |
| emit updatedLayout(); |
| } |
| } |
| |
| qreal QBoxSetPrivate::value(const int index) |
| { |
| if (index < 0 || index >= m_valuesCount) |
| return 0; |
| return m_values[index]; |
| } |
| |
| QT_CHARTS_END_NAMESPACE |
| |
| #include "moc_qboxset.cpp" |
| #include "moc_qboxset_p.cpp" |