declarativeboxplotseries.cpp
345 lines
| 11.4 KiB
| text/x-c
|
CppLexer
Mika Salmela
|
r2548 | /**************************************************************************** | ||
** | ||||
** Copyright (C) 2013 Digia Plc | ||||
** All rights reserved. | ||||
** For any questions to Digia, please use contact form at http://qt.digia.com | ||||
** | ||||
Miikka Heikkinen
|
r2574 | ** This file is part of the Qt Enterprise Charts Add-on. | ||
Mika Salmela
|
r2548 | ** | ||
** $QT_BEGIN_LICENSE$ | ||||
Miikka Heikkinen
|
r2574 | ** Licensees holding valid Qt Enterprise licenses may use this file in | ||
** accordance with the Qt Enterprise License Agreement provided with the | ||||
Mika Salmela
|
r2548 | ** Software or, alternatively, in accordance with the terms contained in | ||
** a written agreement between you and Digia. | ||||
** | ||||
** If you have questions regarding the use of this file, please use | ||||
** contact form at http://qt.digia.com | ||||
** $QT_END_LICENSE$ | ||||
** | ||||
****************************************************************************/ | ||||
#include "declarativebarseries.h" | ||||
#include "declarativeboxplotseries.h" | ||||
#include "qboxset.h" | ||||
#include "qvboxplotmodelmapper.h" | ||||
QTCOMMERCIALCHART_BEGIN_NAMESPACE | ||||
Mika Salmela
|
r2573 | /*! | ||
\qmlclass BoxSet QBoxSet | ||||
BoxSet represents one box-and-whiskers item. It takes five values to create a graphical representation | ||||
of range and three medians. There are two ways to give the values. The first one is with constructor | ||||
or with append method. In these the values have to be given in the following order: lower extreme, lower quartile, median, | ||||
upper quartile and upper extreme. The second method is to create an empty QBoxSet instance and give the values using | ||||
value specific methods. | ||||
\sa BoxPlotSeries | ||||
*/ | ||||
/*! | ||||
\qmlproperty string BoxSet::values | ||||
The values on the box-and-whiskers set. | ||||
*/ | ||||
/*! | ||||
\qmlproperty string BoxSet::label | ||||
Defines the label of the box-and-whiskers set. | ||||
*/ | ||||
/*! | ||||
\qmlproperty int BoxSet::count | ||||
The count of values on the box-and-whiskers set | ||||
*/ | ||||
/*! | ||||
\qmlmethod void BoxSet::at(int index) | ||||
Returns the value at \a index position. | ||||
*/ | ||||
/*! | ||||
\qmlmethod void BoxSet::append(qreal value) | ||||
Appends new value \a value to the end of set. | ||||
*/ | ||||
/*! | ||||
\qmlmethod void BoxSet::clear() | ||||
Sets all values on the set to 0. | ||||
*/ | ||||
/*! | ||||
\qmlmethod void BoxSet::setValue(int index, qreal value) | ||||
Sets a new \a value on the \a index position. | ||||
*/ | ||||
/*! | ||||
\qmlsignal BoxSet::onClicked() | ||||
This signal is emitted when the user clicks with a mouse on top of box-and-whiskers item. | ||||
*/ | ||||
/*! | ||||
\qmlsignal BoxSet::onHovered(bool status) | ||||
The signal is emitted if mouse is hovered on top of box-and-whiskers item. | ||||
Parameter \a status is true, if mouse entered on top of the item, and false if mouse left from top of the item. | ||||
*/ | ||||
/*! | ||||
\qmlsignal BoxSet::onPenChanged() | ||||
This signal is emitted when the pen of the box-and-whiskers item has changed. | ||||
*/ | ||||
/*! | ||||
\qmlsignal BoxSet::onBrushChanged() | ||||
This signal is emitted when the brush of the box-and-whiskers item has changed. | ||||
*/ | ||||
/*! | ||||
\qmlsignal BoxSet::onChangedValues() | ||||
This signal is emitted when multiple values have been changed on the box-and-whiskers item. | ||||
*/ | ||||
/*! | ||||
\qmlsignal BoxSet::onChangedValue(int index) | ||||
This signal is emitted values the value in the box-and-whiskers item has been modified. | ||||
Parameter \a index indicates the position of the modified value. | ||||
*/ | ||||
/*! | ||||
\qmlsignal BoxSet::onCleared() | ||||
This signal is emitted when all the values on the set are cleared to 0. | ||||
*/ | ||||
/*! | ||||
\qmlclass BoxPlotSeries QBoxPlotSeries | ||||
\inherits QAbstractSeries | ||||
BoxPlotSeries represents a series of data shown as box-and-whiskers bars. The purpose of this class is to act as | ||||
a container for single box-and-whiskers items. Each item is drawn to own slot. If chart includes multiple instances of | ||||
BoxPlotSeries then box-and-whiskers items with the same index are drawn to same slot. | ||||
The following QML shows how to create a simple box-and-whiskers chart: | ||||
\code | ||||
import QtQuick 1.0 | ||||
import QtCommercial.Chart 1.3 | ||||
ChartView { | ||||
title: "Box Plot series" | ||||
width: 400 | ||||
height: 300 | ||||
theme: ChartView.ChartThemeBrownSand | ||||
legend.alignment: Qt.AlignBottom | ||||
BoxPlotSeries { | ||||
id: plotSeries | ||||
name: "Income" | ||||
BoxSet { label: "Jan"; values: [3, 4, 5.1, 6.2, 8.5] } | ||||
BoxSet { label: "Feb"; values: [5, 6, 7.5, 8.6, 11.8] } | ||||
BoxSet { label: "Mar"; values: [3.2, 5, 5.7, 8, 9.2] } | ||||
BoxSet { label: "Apr"; values: [3.8, 5, 6.4, 7, 8] } | ||||
BoxSet { label: "May"; values: [4, 5, 5.2, 6, 7] } | ||||
} | ||||
} | ||||
\endcode | ||||
\beginfloatleft | ||||
\image examples_qmlboxplot.png | ||||
\endfloat | ||||
\clearfloat | ||||
*/ | ||||
/*! | ||||
\qmlmethod BoxPlotSeries::append(string label, VariantList values) | ||||
Appends a new box-and-whiskers set with \a label and \a values to the series. | ||||
*/ | ||||
/*! | ||||
\qmlmethod BoxPlotSeries::append(BoxSet box) | ||||
Appends the \a box to the series. | ||||
*/ | ||||
/*! | ||||
\qmlmethod BoxPlotSeries::insert(int index, string label, VariantList values) | ||||
Inserts a new box-and-whiskers set with \a label and \a values at the \a index position. | ||||
*/ | ||||
/*! | ||||
\qmlmethod BoxPlotSeries::remove(QBoxSet boxset) | ||||
Removes the \a boxset from the series. | ||||
*/ | ||||
/*! | ||||
\qmlmethod BoxPlotSeries::clear() | ||||
Removes all boxsets from the series. Deletes removed sets. | ||||
*/ | ||||
/*! | ||||
\qmlsignal BoxPlotSeries::onClicked(BoxSet boxset); | ||||
Signal is emitted when the user clicks the \a boxset on the chart. | ||||
*/ | ||||
/*! | ||||
\qmlsignal BoxPlotSeries::onHovered(bool status, BoxSet boxset); | ||||
Signal is emitted when there is change in hover \a status over \a boxset. | ||||
*/ | ||||
/*! | ||||
\qmlsignal BoxPlotSeries::onCountChanged(); | ||||
Signal is emitted when there is change in count of box-and-whiskers items in the series. | ||||
*/ | ||||
/*! | ||||
\qmlsignal BoxPlotSeries::onBoxsetsAdded() | ||||
Signal is emitted when new box-and-whiskers sets are added to the series. | ||||
*/ | ||||
/*! | ||||
\qmlsignal BoxPlotSeries::onBoxsetsRemoved() | ||||
Signal is emitted when new box-and-whiskers sets are removed from the series. | ||||
*/ | ||||
/*! | ||||
\qmlproperty AbstractAxis BoxPlotSeries::axisX | ||||
The x axis used for the series. If you leave both axisX and axisXTop undefined, a BarCategoriesAxis is created for | ||||
the series. | ||||
\sa axisXTop | ||||
*/ | ||||
/*! | ||||
\qmlproperty AbstractAxis BoxPlotSeries::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 BoxPlotSeries::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 BoxPlotSeries::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 | ||||
*/ | ||||
/*! | ||||
\qmlproperty bool BoxPlotSeries::boxOutlineVisible | ||||
This property configures the visibility of the middle box outline. | ||||
*/ | ||||
/*! | ||||
\qmlproperty Pen BoxPlotSeries::pen | ||||
This property configures the pen of the box-and-whiskers items. | ||||
*/ | ||||
/*! | ||||
\qmlproperty Brush BoxPlotSeries::brush | ||||
This property configures the brush of the box-and-whiskers items. | ||||
*/ | ||||
/*! | ||||
\qmlsignal BoxPlotSeries::onBoxOutlineVisibilityChanged() | ||||
Signal is emitted when the middle box outline visibility is changed. | ||||
*/ | ||||
/*! | ||||
\qmlsignal BoxPlotSeries::onPenChanged() | ||||
Signal is emitted when the pen for box-and-whiskers items has changed. | ||||
*/ | ||||
/*! | ||||
\qmlsignal BoxPlotSeries::onBrushChanged() | ||||
Signal is emitted when the brush for box-and-whiskers items has changed. | ||||
*/ | ||||
/*! | ||||
\qmlsignal BoxPlotSeries::onClicked(BoxSet boxset) | ||||
Signal is emitted when the user clicks the \a boxset on the chart. | ||||
*/ | ||||
/*! | ||||
\qmlsignal BoxPlotSeries::onHovered(bool status, BoxSet boxset) | ||||
Signal is emitted when there is change in hover \a status over \a boxset. | ||||
*/ | ||||
/*! | ||||
\qmlsignal BoxPlotSeries::onAxisXChanged(AbstractAxis axis) | ||||
Signal is emitted when there is change in X axis. | ||||
*/ | ||||
/*! | ||||
\qmlsignal BoxPlotSeries::onAxisYChanged(AbstractAxis axis) | ||||
Signal is emitted when there is change in Y axis. | ||||
*/ | ||||
/*! | ||||
\qmlsignal BoxPlotSeries::onAxisXTopChanged(AbstractAxis axis) | ||||
Signal is emitted when there is change in top X axis. | ||||
*/ | ||||
/*! | ||||
\qmlsignal BoxPlotSeries::onAxisYRightChanged(AbstractAxis axis) | ||||
Signal is emitted when there is change in Y right axis. | ||||
*/ | ||||
Mika Salmela
|
r2548 | DeclarativeBoxSet::DeclarativeBoxSet(const QString label, QObject *parent) | ||
: QBoxSet(label, parent) | ||||
{ | ||||
connect(this, SIGNAL(valuesChanged()), this, SIGNAL(changedValues())); | ||||
connect(this, SIGNAL(valueChanged(int)), this, SIGNAL(changedValue(int))); | ||||
} | ||||
QVariantList DeclarativeBoxSet::values() | ||||
{ | ||||
QVariantList values; | ||||
for (int i(0); i < 5; i++) | ||||
values.append(QVariant(QBoxSet::at(i))); | ||||
return values; | ||||
} | ||||
void DeclarativeBoxSet::setValues(QVariantList values) | ||||
{ | ||||
for (int i(0); i < values.count(); i++) { | ||||
if (values.at(i).canConvert(QVariant::Double)) | ||||
QBoxSet::append(values[i].toDouble()); | ||||
} | ||||
} | ||||
// ===================================================== | ||||
Miikka Heikkinen
|
r2551 | DeclarativeBoxPlotSeries::DeclarativeBoxPlotSeries(QDECLARATIVE_ITEM *parent) : | ||
Mika Salmela
|
r2548 | QBoxPlotSeries(parent), | ||
m_axes(new DeclarativeAxes(this)) | ||||
{ | ||||
connect(m_axes, SIGNAL(axisXChanged(QAbstractAxis*)), this, SIGNAL(axisXChanged(QAbstractAxis*))); | ||||
connect(m_axes, SIGNAL(axisYChanged(QAbstractAxis*)), this, SIGNAL(axisYChanged(QAbstractAxis*))); | ||||
connect(m_axes, SIGNAL(axisXTopChanged(QAbstractAxis*)), this, SIGNAL(axisXTopChanged(QAbstractAxis*))); | ||||
connect(m_axes, SIGNAL(axisYRightChanged(QAbstractAxis*)), this, SIGNAL(axisYRightChanged(QAbstractAxis*))); | ||||
connect(this, SIGNAL(hovered(bool, QBoxSet*)), this, SLOT(onHovered(bool, QBoxSet*))); | ||||
connect(this, SIGNAL(clicked(QBoxSet*)), this, SLOT(onClicked(QBoxSet*))); | ||||
} | ||||
void DeclarativeBoxPlotSeries::classBegin() | ||||
{ | ||||
} | ||||
void DeclarativeBoxPlotSeries::componentComplete() | ||||
{ | ||||
foreach (QObject *child, children()) { | ||||
if (qobject_cast<DeclarativeBoxSet *>(child)) { | ||||
QBoxPlotSeries::append(qobject_cast<DeclarativeBoxSet *>(child)); | ||||
} else if (qobject_cast<QVBoxPlotModelMapper *>(child)) { | ||||
QVBoxPlotModelMapper *mapper = qobject_cast<QVBoxPlotModelMapper *>(child); | ||||
mapper->setSeries(this); | ||||
} | ||||
} | ||||
} | ||||
Miikka Heikkinen
|
r2551 | QDECLARATIVE_LIST_PROPERTY<QObject> DeclarativeBoxPlotSeries::seriesChildren() | ||
Mika Salmela
|
r2548 | { | ||
Miikka Heikkinen
|
r2551 | return QDECLARATIVE_LIST_PROPERTY<QObject>(this, 0, &DeclarativeBoxPlotSeries::appendSeriesChildren LIST_PROPERTY_PARAM_DEFAULTS); | ||
Mika Salmela
|
r2548 | } | ||
Miikka Heikkinen
|
r2551 | void DeclarativeBoxPlotSeries::appendSeriesChildren(QDECLARATIVE_LIST_PROPERTY<QObject> *list, QObject *element) | ||
Mika Salmela
|
r2548 | { | ||
// Empty implementation; the children are parsed in componentComplete instead | ||||
Q_UNUSED(list); | ||||
Q_UNUSED(element); | ||||
} | ||||
DeclarativeBoxSet *DeclarativeBoxPlotSeries::at(int index) | ||||
{ | ||||
QList<QBoxSet *> setList = boxSets(); | ||||
if (index >= 0 && index < setList.count()) | ||||
return qobject_cast<DeclarativeBoxSet *>(setList[index]); | ||||
return 0; | ||||
} | ||||
DeclarativeBoxSet *DeclarativeBoxPlotSeries::insert(int index, const QString label, QVariantList values) | ||||
{ | ||||
DeclarativeBoxSet *barset = new DeclarativeBoxSet(label, this); | ||||
barset->setValues(values); | ||||
if (QBoxPlotSeries::insert(index, barset)) | ||||
return barset; | ||||
delete barset; | ||||
return 0; | ||||
} | ||||
void DeclarativeBoxPlotSeries::onHovered(bool status, QBoxSet *boxset) | ||||
{ | ||||
emit hovered(status, qobject_cast<DeclarativeBoxSet *>(boxset)); | ||||
} | ||||
void DeclarativeBoxPlotSeries::onClicked(QBoxSet *boxset) | ||||
{ | ||||
emit clicked(qobject_cast<DeclarativeBoxSet *>(boxset)); | ||||
} | ||||
#include "moc_declarativeboxplotseries.cpp" | ||||
QTCOMMERCIALCHART_END_NAMESPACE | ||||