qabstractseries.cpp
500 lines
| 15.5 KiB
| text/x-c
|
CppLexer
Titta Heikkala
|
r2845 | /****************************************************************************** | ||
Jani Honkonen
|
r794 | ** | ||
Titta Heikkala
|
r2845 | ** Copyright (C) 2015 The Qt Company Ltd. | ||
** Contact: http://www.qt.io/licensing/ | ||||
Jani Honkonen
|
r794 | ** | ||
Titta Heikkala
|
r2740 | ** This file is part of the Qt Charts module. | ||
Jani Honkonen
|
r794 | ** | ||
Titta Heikkala
|
r2845 | ** $QT_BEGIN_LICENSE:COMM$ | ||
Jani Honkonen
|
r794 | ** | ||
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 | ||||
** and conditions see http://www.qt.io/terms-conditions. For further | ||||
** information use the contact form at http://www.qt.io/contact-us. | ||||
Jani Honkonen
|
r794 | ** | ||
Titta Heikkala
|
r2845 | ** $QT_END_LICENSE$ | ||
** | ||||
******************************************************************************/ | ||||
Jani Honkonen
|
r794 | |||
Titta Heikkala
|
r2714 | #include <QtCharts/QAbstractSeries> | ||
#include <private/qabstractseries_p.h> | ||||
#include <private/chartdataset_p.h> | ||||
#include <QtCharts/QChart> | ||||
#include <private/qchart_p.h> | ||||
#include <private/chartitem_p.h> | ||||
#include <private/xydomain_p.h> | ||||
#include <private/xlogydomain_p.h> | ||||
#include <private/logxydomain_p.h> | ||||
#include <private/logxlogydomain_p.h> | ||||
Michal Klocek
|
r938 | |||
Titta Heikkala
|
r2712 | QT_CHARTS_BEGIN_NAMESPACE | ||
sauimone
|
r62 | |||
Tero Ahola
|
r309 | /*! | ||
Tero Ahola
|
r988 | \class QAbstractSeries | ||
Titta Heikkala
|
r2639 | \inmodule Qt Charts | ||
Miikka Heikkinen
|
r2591 | \brief Base class for all Qt Chart series. | ||
Tero Ahola
|
r310 | |||
Usually you use the series type specific inherited classes instead of the base class. | ||||
sauimone
|
r1586 | \sa QXYSeries, QLineSeries, QSplineSeries, QScatterSeries, QAreaSeries, QAbstractBarSeries, QStackedBarSeries, | ||
Tero Ahola
|
r973 | QPercentBarSeries, QPieSeries | ||
Tero Ahola
|
r309 | */ | ||
Tero Ahola
|
r1521 | /*! | ||
Titta Heikkala
|
r2639 | \qmltype AbstractSeries | ||
\instantiates QAbstractSeries | ||||
Titta Heikkala
|
r2712 | \inqmlmodule QtCharts | ||
Titta Heikkala
|
r2639 | |||
Titta Heikkala
|
r2712 | \brief Base class for all Qt Chart series. | ||
Titta Heikkala
|
r2639 | |||
Titta Heikkala
|
r2712 | AbstractSeries is the base class for all series. | ||
The class cannot be instantiated by the user. | ||||
Tero Ahola
|
r1521 | */ | ||
Tero Ahola
|
r309 | |||
/*! | ||||
Michal Klocek
|
r1107 | \enum QAbstractSeries::SeriesType | ||
Tero Ahola
|
r309 | |||
The type of the series object. | ||||
\value SeriesTypeLine | ||||
\value SeriesTypeArea | ||||
\value SeriesTypeBar | ||||
\value SeriesTypeStackedBar | ||||
\value SeriesTypePercentBar | ||||
\value SeriesTypePie | ||||
\value SeriesTypeScatter | ||||
\value SeriesTypeSpline | ||||
sauimone
|
r1709 | \value SeriesTypeHorizontalBar | ||
\value SeriesTypeHorizontalStackedBar | ||||
\value SeriesTypeHorizontalPercentBar | ||||
Mika Salmela
|
r2548 | \value SeriesTypeBoxPlot | ||
Tero Ahola
|
r309 | */ | ||
/*! | ||||
Tero Ahola
|
r1462 | \property QAbstractSeries::type | ||
The type of the series. | ||||
Tero Ahola
|
r309 | */ | ||
Tero Ahola
|
r1521 | /*! | ||
\qmlproperty ChartView.SeriesType AbstractSeries::type | ||||
The type of the series. | ||||
*/ | ||||
Tero Ahola
|
r309 | |||
Marek Rosa
|
r908 | /*! | ||
Tero Ahola
|
r988 | \property QAbstractSeries::name | ||
Miikka Heikkinen
|
r2539 | \brief name of the series property. The name is shown in legend for series and supports html formatting. | ||
Tero Ahola
|
r1521 | */ | ||
/*! | ||||
\qmlproperty string AbstractSeries::name | ||||
Miikka Heikkinen
|
r2539 | Name of the series. The name is shown in legend for series and supports html formatting. | ||
Marek Rosa
|
r908 | */ | ||
Jani Honkonen
|
r1337 | /*! | ||
\fn void QAbstractSeries::nameChanged() | ||||
This signal is emitted when the series name changes. | ||||
Tero Ahola
|
r1521 | */ | ||
/*! | ||||
sauimone
|
r1658 | \qmlsignal AbstractSeries::onNameChanged() | ||
Tero Ahola
|
r1521 | This signal is emitted when the series name changes. | ||
Jani Honkonen
|
r1337 | */ | ||
Jani Honkonen
|
r414 | /*! | ||
Tero Ahola
|
r1343 | \property QAbstractSeries::visible | ||
\brief whether the series is visible or not; true by default. | ||||
*/ | ||||
sauimone
|
r1658 | /*! | ||
Tero Ahola
|
r2068 | \qmlproperty bool AbstractSeries::visible | ||
sauimone
|
r1658 | Visibility of the series. True by default. | ||
*/ | ||||
Jani Honkonen
|
r414 | |||
Tero Ahola
|
r1343 | /*! | ||
\fn void QAbstractSeries::visibleChanged() | ||||
Emitted when the series visibility changes. | ||||
Jani Honkonen
|
r414 | */ | ||
sauimone
|
r1658 | /*! | ||
\qmlsignal AbstractSeries::onVisibleChanged() | ||||
Emitted when the series visibility changes. | ||||
*/ | ||||
Tero Ahola
|
r2068 | |||
/*! | ||||
\property QAbstractSeries::opacity | ||||
\brief The opacity of the series. | ||||
Miikka Heikkinen
|
r2520 | |||
Tero Ahola
|
r2068 | By default the opacity is 1.0. The valid values range from 0.0 (transparent) to 1.0 (opaque). | ||
*/ | ||||
/*! | ||||
\qmlproperty real AbstractSeries::opacity | ||||
The opacity of the series. By default the opacity is 1.0. | ||||
The valid values range from 0.0 (transparent) to 1.0 (opaque). | ||||
*/ | ||||
/*! | ||||
\fn void QAbstractSeries::opacityChanged() | ||||
Emitted when the opacity of the series changes. | ||||
*/ | ||||
/*! | ||||
\qmlsignal AbstractSeries::onOpacityChanged() | ||||
Emitted when the opacity of the series changes. | ||||
*/ | ||||
Miikka Heikkinen
|
r2820 | /*! | ||
\property QAbstractSeries::useOpenGL | ||||
\brief Specifies whether or not the series drawing is accelerated with OpenGL. | ||||
Drawing series with OpenGL is supported only for QLineSeries and QScatterSeries. | ||||
Line series used as edge series for a QAreaSeries cannot use OpenGL acceleration. | ||||
When a chart contains any series that are drawn with OpenGL, a transparent QOpenGLWidget | ||||
Miikka Heikkinen
|
r2842 | is created on top of the chart plot area. The accelerated series are not drawn on the underlying | ||
Miikka Heikkinen
|
r2820 | QGraphicsView, but are instead drawn on the created QOpenGLWidget. | ||
Performance gained from using OpenGL to accelerate series drawing depends on the underlying | ||||
hardware, but in most cases it is significant. For example, on a standard desktop computer, | ||||
enabling OpenGL acceleration for a series typically allows rendering at least hundred times | ||||
more points without reduction on the frame rate. | ||||
Chart size also has less effect on the frame rate. | ||||
The OpenGL acceleration of series drawing is meant for use cases that need fast drawing of | ||||
large numbers of points. It is optimized for efficiency, and therefore the series using | ||||
Miikka Heikkinen
|
r2842 | it lack support for many features available to non-accelerated series: | ||
Miikka Heikkinen
|
r2820 | |||
\list | ||||
\li Series animations are not supported for accelerated series. | ||||
\li Antialiasing is not supported for accelerated series. | ||||
Miikka Heikkinen
|
r2831 | \li Point labels are not supported for accelerated series. | ||
Miikka Heikkinen
|
r2820 | \li Pen styles and marker shapes are ignored for accelerated series. | ||
Only solid lines and plain scatter dots are supported. | ||||
The scatter dots may be circular or rectangular, depending on the underlying graphics | ||||
hardware and drivers. | ||||
Miikka Heikkinen
|
r2842 | \li Polar charts do not support accelerated series. | ||
Miikka Heikkinen
|
r2831 | \li Mouse events are not supported for accelerated series. | ||
Miikka Heikkinen
|
r2850 | \li Enabling chart drop shadow or using transparent chart background color is not recommended | ||
when using accelerated series, as that can slow the frame rate down significantly. | ||||
Miikka Heikkinen
|
r2820 | \endlist | ||
Miikka Heikkinen
|
r2842 | These additional restrictions stem from the fact that the accelerated series is drawn on a | ||
separate widget on top of the chart: | ||||
\list | ||||
\li If you draw any graphics items on top of a chart containing an accelerated series, | ||||
the accelerated series is drawn over those items. | ||||
\li To enable QOpenGLWidget to be partially transparent, it needs to be stacked on top of | ||||
all other widgets. This means you cannot have other widgets partially covering the | ||||
chart when using accelerated series. | ||||
\li Accelerated series are not supported for use cases where the graphics scene has more than | ||||
one graphics view attached to it. | ||||
\li Accelerated series are not supported for use cases where the chart doesn't fill the entire | ||||
graphics view or has non-default geometry. For example, scrolling the view with scroll | ||||
bars or adding transformations to the graphics view cause the accelerated series to | ||||
be drawn in incorrect position related to the chart. | ||||
\endlist | ||||
Miikka Heikkinen
|
r2820 | The default value is \c{false}. | ||
*/ | ||||
/*! | ||||
\qmlproperty bool AbstractSeries::useOpenGL | ||||
Specifies whether or not the series is drawn with OpenGL. | ||||
Drawing series with OpenGL is supported only for LineSeries and ScatterSeries. | ||||
Miikka Heikkinen
|
r2842 | Line series used as edge series for a AreaSeries cannot use OpenGL acceleration. | ||
When a chart contains any series that are drawn with OpenGL, an additional transparent child | ||||
node is created for the ChartView node. The accelerated series are not drawn on the | ||||
ChartView node, but are instead drawn on the child node. | ||||
Performance gained from using OpenGL to accelerate series drawing depends on the underlying | ||||
hardware, but in most cases it is significant. For example, on a standard desktop computer, | ||||
enabling OpenGL acceleration for a series typically allows rendering at least hundred times | ||||
more points without reduction on the frame rate. | ||||
Chart size also has less effect on the frame rate. | ||||
The biggest performance sink when rendering ChartView is rendering and uploading the underlying | ||||
chart texture. If the underlying chart itself is not changing rapidly, significant extra | ||||
performance is gained from not needing to regenerate the chart texture for each frame. | ||||
The OpenGL acceleration of series drawing is meant for use cases that need fast drawing of | ||||
large numbers of points. It is optimized for efficiency, and therefore the series using | ||||
it lack support for many features available to non-accelerated series: | ||||
Miikka Heikkinen
|
r2820 | |||
Miikka Heikkinen
|
r2842 | \list | ||
\li Series animations are not supported for accelerated series. | ||||
\li Antialiasing is not supported for accelerated series. | ||||
\li Point labels are not supported for accelerated series. | ||||
\li Marker shapes are ignored for accelerated series. | ||||
Only plain scatter dots are supported. | ||||
The scatter dots may be circular or rectangular, depending on the underlying graphics | ||||
hardware and drivers. | ||||
\li Polar charts do not support accelerated series. | ||||
\li Mouse events are not supported for accelerated series. | ||||
Miikka Heikkinen
|
r2850 | \li Enabling chart drop shadow or using transparent chart background color is not recommended | ||
when using accelerated series, as that can slow the frame rate down significantly. | ||||
Miikka Heikkinen
|
r2842 | \endlist | ||
Miikka Heikkinen
|
r2820 | |||
The default value is \c{false}. | ||||
*/ | ||||
/*! | ||||
\fn void QAbstractSeries::useOpenGLChanged() | ||||
Emitted when the useOpenGL property value changes. | ||||
*/ | ||||
/*! | ||||
\qmlsignal AbstractSeries::onUseOpenGLChanged() | ||||
Emitted when the useOpenGL property value changes. | ||||
*/ | ||||
Jani Honkonen
|
r414 | /*! | ||
Tero Ahola
|
r973 | \internal | ||
Miikka Heikkinen
|
r2494 | \brief Constructs QAbstractSeries object with \a parent. | ||
Jani Honkonen
|
r414 | */ | ||
Tero Ahola
|
r988 | QAbstractSeries::QAbstractSeries(QAbstractSeriesPrivate &d, QObject *parent) : | ||
Tero Ahola
|
r973 | QObject(parent), | ||
d_ptr(&d) | ||||
Michal Klocek
|
r938 | { | ||
} | ||||
Tero Ahola
|
r973 | /*! | ||
\brief Virtual destructor for the chart series. | ||||
*/ | ||||
Tero Ahola
|
r988 | QAbstractSeries::~QAbstractSeries() | ||
Michal Klocek
|
r938 | { | ||
Michal Klocek
|
r2273 | if (d_ptr->m_chart) | ||
Miikka Heikkinen
|
r2494 | qFatal("Series still bound to a chart when destroyed!"); | ||
Michal Klocek
|
r938 | } | ||
Jani Honkonen
|
r2104 | void QAbstractSeries::setName(const QString &name) | ||
Michal Klocek
|
r938 | { | ||
Tero Ahola
|
r1328 | if (name != d_ptr->m_name) { | ||
d_ptr->m_name = name; | ||||
Tero Ahola
|
r1342 | emit nameChanged(); | ||
Tero Ahola
|
r1328 | } | ||
Michal Klocek
|
r938 | } | ||
Tero Ahola
|
r988 | QString QAbstractSeries::name() const | ||
Michal Klocek
|
r938 | { | ||
return d_ptr->m_name; | ||||
} | ||||
Tero Ahola
|
r1342 | void QAbstractSeries::setVisible(bool visible) | ||
{ | ||||
if (visible != d_ptr->m_visible) { | ||||
d_ptr->m_visible = visible; | ||||
emit visibleChanged(); | ||||
} | ||||
} | ||||
bool QAbstractSeries::isVisible() const | ||||
{ | ||||
return d_ptr->m_visible; | ||||
} | ||||
Tero Ahola
|
r2067 | qreal QAbstractSeries::opacity() const | ||
{ | ||||
return d_ptr->m_opacity; | ||||
} | ||||
void QAbstractSeries::setOpacity(qreal opacity) | ||||
{ | ||||
if (opacity != d_ptr->m_opacity) { | ||||
d_ptr->m_opacity = opacity; | ||||
emit opacityChanged(); | ||||
} | ||||
} | ||||
Miikka Heikkinen
|
r2820 | void QAbstractSeries::setUseOpenGL(bool enable) | ||
{ | ||||
#ifdef QT_NO_OPENGL | ||||
Q_UNUSED(enable) | ||||
#else | ||||
bool polarChart = d_ptr->m_chart && d_ptr->m_chart->chartType() == QChart::ChartTypePolar; | ||||
bool supportedSeries = (type() == SeriesTypeLine || type() == SeriesTypeScatter); | ||||
if ((!enable || !d_ptr->m_blockOpenGL) | ||||
&& supportedSeries | ||||
&& enable != d_ptr->m_useOpenGL | ||||
&& (!enable || !polarChart)) { | ||||
d_ptr->m_useOpenGL = enable; | ||||
emit useOpenGLChanged(); | ||||
} | ||||
#endif | ||||
} | ||||
bool QAbstractSeries::useOpenGL() const | ||||
{ | ||||
return d_ptr->m_useOpenGL; | ||||
} | ||||
Jani Honkonen
|
r1314 | /*! | ||
\brief Returns the chart where series belongs to. | ||||
Set automatically when the series is added to the chart | ||||
and unset when the series is removed from the chart. | ||||
*/ | ||||
Jani Honkonen
|
r2104 | QChart *QAbstractSeries::chart() const | ||
Jani Honkonen
|
r1314 | { | ||
return d_ptr->m_chart; | ||||
} | ||||
Marek Rosa
|
r1638 | /*! | ||
Miikka Heikkinen
|
r2520 | \brief Sets the visibility of the series to true. | ||
Marek Rosa
|
r1638 | |||
\sa setVisible(), isVisible() | ||||
*/ | ||||
Michal Klocek
|
r1553 | void QAbstractSeries::show() | ||
{ | ||||
setVisible(true); | ||||
} | ||||
Marek Rosa
|
r1638 | /*! | ||
Miikka Heikkinen
|
r2520 | \brief Sets the visibility of the series to false. | ||
Marek Rosa
|
r1638 | |||
\sa setVisible(), isVisible() | ||||
*/ | ||||
Michal Klocek
|
r1553 | void QAbstractSeries::hide() | ||
{ | ||||
setVisible(false); | ||||
} | ||||
Tero Ahola
|
r2363 | /*! | ||
Attach \a axis to the series. | ||||
\return true if the axis was attached successfully, false otherwise. | ||||
Miikka Heikkinen
|
r2571 | \note If multiple axes of same orientation are attached to same series, | ||
they will have same min/max ranges. | ||||
Tero Ahola
|
r2363 | \sa QChart::addAxis(), QChart::createDefaultAxes() | ||
*/ | ||||
Michal Klocek
|
r2273 | bool QAbstractSeries::attachAxis(QAbstractAxis* axis) | ||
{ | ||||
if(d_ptr->m_chart) { | ||||
Tero Ahola
|
r2363 | return d_ptr->m_chart->d_ptr->m_dataset->attachAxis(this, axis); | ||
Michal Klocek
|
r2273 | } else { | ||
qWarning()<<"Series not in the chart. Please addSeries to chart first."; | ||||
return false; | ||||
} | ||||
} | ||||
Tero Ahola
|
r2363 | /*! | ||
Detach \a axis from the series. | ||||
\return true if the axis was detached successfully, false otherwise. | ||||
\sa QChart::removeAxis() | ||||
*/ | ||||
Michal Klocek
|
r2273 | bool QAbstractSeries::detachAxis(QAbstractAxis* axis) | ||
{ | ||||
if(d_ptr->m_chart) { | ||||
Tero Ahola
|
r2363 | return d_ptr->m_chart->d_ptr->m_dataset->detachAxis(this, axis); | ||
Michal Klocek
|
r2273 | } | ||
else { | ||||
qWarning()<<"Series not in the chart. Please addSeries to chart first."; | ||||
return false; | ||||
} | ||||
} | ||||
Tero Ahola
|
r2363 | /*! | ||
Returns the list of axes attached to the series. Usually there is an x-axis and a y-axis attached to a series, except | ||||
in case of a QPieSeries, which does not have any axes attached. | ||||
\sa attachAxis(), detachAxis() | ||||
*/ | ||||
Michal Klocek
|
r2273 | QList<QAbstractAxis*> QAbstractSeries::attachedAxes() | ||
{ | ||||
return d_ptr->m_axes; | ||||
} | ||||
Michal Klocek
|
r938 | /////////////////////////////////////////////////////////////////////////////////////////////////// | ||
Jani Honkonen
|
r2104 | QAbstractSeriesPrivate::QAbstractSeriesPrivate(QAbstractSeries *q) | ||
Jani Honkonen
|
r2097 | : q_ptr(q), | ||
m_chart(0), | ||||
Michal Klocek
|
r2273 | m_item(0), | ||
Marek Rosa
|
r2275 | m_domain(new XYDomain()), | ||
Jani Honkonen
|
r2097 | m_visible(true), | ||
Miikka Heikkinen
|
r2820 | m_opacity(1.0), | ||
m_useOpenGL(false), | ||||
m_blockOpenGL(false) | ||||
Michal Klocek
|
r938 | { | ||
} | ||||
Tero Ahola
|
r988 | QAbstractSeriesPrivate::~QAbstractSeriesPrivate() | ||
Michal Klocek
|
r938 | { | ||
} | ||||
Michal Klocek
|
r2285 | void QAbstractSeriesPrivate::setDomain(AbstractDomain* domain) | ||
Michal Klocek
|
r2273 | { | ||
Michal Klocek
|
r2285 | Q_ASSERT(domain); | ||
if(m_domain.data()!=domain) { | ||||
Michal Klocek
|
r2273 | if(!m_item.isNull()) QObject::disconnect(m_domain.data(), SIGNAL(updated()), m_item.data(), SLOT(handleDomainUpdated())); | ||
Michal Klocek
|
r2285 | m_domain.reset(domain); | ||
Michal Klocek
|
r2273 | if(!m_item.isNull()) { | ||
QObject::connect(m_domain.data(), SIGNAL(updated()),m_item.data(), SLOT(handleDomainUpdated())); | ||||
m_item->handleDomainUpdated(); | ||||
} | ||||
} | ||||
} | ||||
Miikka Heikkinen
|
r2707 | void QAbstractSeriesPrivate::setPresenter(ChartPresenter *presenter) | ||
{ | ||||
m_presenter = presenter; | ||||
} | ||||
ChartPresenter *QAbstractSeriesPrivate::presenter() const | ||||
{ | ||||
return m_presenter; | ||||
} | ||||
Michal Klocek
|
r2273 | void QAbstractSeriesPrivate::initializeGraphics(QGraphicsItem* parent) | ||
{ | ||||
Q_ASSERT(!m_item.isNull()); | ||||
Q_UNUSED(parent); | ||||
QObject::connect(m_domain.data(), SIGNAL(updated()),m_item.data(), SLOT(handleDomainUpdated())); | ||||
} | ||||
Titta Heikkala
|
r2804 | void QAbstractSeriesPrivate::initializeAnimations(QChart::AnimationOptions options, int duration, | ||
QEasingCurve &curve) | ||||
Michal Klocek
|
r2273 | { | ||
Q_UNUSED(options); | ||||
Titta Heikkala
|
r2804 | Q_UNUSED(duration); | ||
Q_UNUSED(curve); | ||||
Michal Klocek
|
r2273 | } | ||
Titta Heikkala
|
r2781 | bool QAbstractSeriesPrivate::reverseXAxis() | ||
{ | ||||
bool reverseXAxis = false; | ||||
if (m_axes.size() != 0 && !(m_chart->chartType() == QChart::ChartTypePolar)) { | ||||
int i = 0; | ||||
while (i < m_axes.size()) { | ||||
if (m_axes.at(i)->orientation() == Qt::Horizontal && m_axes.at(i)->isReverse()) { | ||||
reverseXAxis = true; | ||||
break; | ||||
} | ||||
i++; | ||||
} | ||||
} | ||||
return reverseXAxis; | ||||
} | ||||
bool QAbstractSeriesPrivate::reverseYAxis() | ||||
{ | ||||
bool reverseYAxis = false; | ||||
if (m_axes.size() != 0 && !(m_chart->chartType() == QChart::ChartTypePolar)) { | ||||
int i = 0; | ||||
while (i < m_axes.size()) { | ||||
if (m_axes.at(i)->orientation() == Qt::Vertical && m_axes.at(i)->isReverse()) { | ||||
reverseYAxis = true; | ||||
break; | ||||
} | ||||
i++; | ||||
} | ||||
} | ||||
return reverseYAxis; | ||||
} | ||||
Miikka Heikkinen
|
r2820 | // This function can be used to explicitly block OpenGL use from some otherwise supported series, | ||
// such as the line series used as edge series of an area series. | ||||
void QAbstractSeriesPrivate::setBlockOpenGL(bool enable) | ||||
{ | ||||
m_blockOpenGL = enable; | ||||
if (enable) | ||||
q_ptr->setUseOpenGL(false); | ||||
} | ||||
Tero Ahola
|
r988 | #include "moc_qabstractseries.cpp" | ||
#include "moc_qabstractseries_p.cpp" | ||||
Michal Klocek
|
r938 | |||
Titta Heikkala
|
r2712 | QT_CHARTS_END_NAMESPACE | ||
Michal Klocek
|
r938 | |||