##// END OF EJS Templates
QML demo basic area chart to use value axis to make it simpler
QML demo basic area chart to use value axis to make it simpler

File last commit:

r1889:def1d1266e3a
r1934:e8c5b1221524
Show More
qvalueaxis.cpp
423 lines | 9.6 KiB | text/x-c | CppLexer
Michal Klocek
Adds new API classes...
r1540 /****************************************************************************
**
** Copyright (C) 2012 Digia Plc
** All rights reserved.
** For any questions to Digia, please use contact form at http://qt.digia.com
**
** This file is part of the Qt Commercial Charts Add-on.
**
** $QT_BEGIN_LICENSE$
** Licensees holding valid Qt Commercial licenses may use this file in
** accordance with the Qt Commercial License Agreement provided with the
** 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$
**
****************************************************************************/
Marek Rosa
renamed QValueAxis related files
r1805 #include "qvalueaxis.h"
#include "qvalueaxis_p.h"
#include "chartvalueaxisx_p.h"
#include "chartvalueaxisy_p.h"
Michal Klocek
Creates default initalization of axes
r1661 #include "domain_p.h"
Michal Klocek
Implements qbarcategoriesaxis logic...
r1725 #include "chartdataset_p.h"
#include <qmath.h>
Michal Klocek
Adds new API classes...
r1540
QTCOMMERCIALCHART_BEGIN_NAMESPACE
Marek Rosa
Some docs to QValuesAxis
r1547 /*!
Marek Rosa
class QValuesAxis renamed to QValueAxis
r1804 \class QValueAxis
\brief The QValueAxis class is used for manipulating chart's axis.
Marek Rosa
Some docs to QValuesAxis
r1547 \mainclass
Marek Rosa
Docs update after classes renaming
r1812 ValueAxis can be setup to show axis line with tick marks, grid lines and shades.
Marek Rosa
QValueAxis docs: added usage snippet
r1881 Values of axis are drawn to position of ticks.
Example code on how to use QValueAxis.
\code
QChartView *chartView = new QChartView;
QLineSeries *series = new QLineSeries;
// ...
Marek Rosa
QDateTimeAxis: added snippet on how to use it
r1882 chartView->chart()->addSeries(series);
Marek Rosa
QValueAxis docs: added usage snippet
r1881 QValueAxis *axisX = new QValueAxis;
axisX->setRange(10, 20.5);
axisX->setTickCount(10);
axisX->setLabelFormat("%.2f");
chartView->chart()->setAxisX(series, axisX);
\endcode
Marek Rosa
Some docs to QValuesAxis
r1547 */
/*!
Marek Rosa
Docs update after classes renaming
r1812 \qmlclass ValueAxis QValueAxis
Tero Ahola
Fixed minor issues in QML axes documentation
r1869 \inherits AbstractAxis
Marek Rosa
Docs update after classes renaming
r1812 \brief The ValueAxis element is used for manipulating chart's axes
Marek Rosa
Some docs to QValuesAxis
r1547
sauimone
qml doc update
r1639 ValueAxis can be setup to show axis line with tick marks, grid lines and shades.
Values of axis are drawn to position of ticks
Marek Rosa
Some docs to QValuesAxis
r1547
To access Axes you can use ChartView API. For example:
\code
ChartView {
Marek Rosa
Docs update after classes renaming
r1812 ValueAxis {
sauimone
qml doc update
r1639 id: xAxis
min: 0
max: 10
}
// Add a few series...
Marek Rosa
Some docs to QValuesAxis
r1547 }
\endcode
*/
/*!
Marek Rosa
class QValuesAxis renamed to QValueAxis
r1804 \property QValueAxis::min
Marek Rosa
Some docs to QValuesAxis
r1547 Defines the minimum value on the axis.
Marek Rosa
Updated min, max properties of values and datetime axes descriptions with information about maintaining the range validity
r1730 When setting this property the max is adjusted if necessary, to ensure that the range remains valid.
Marek Rosa
Some docs to QValuesAxis
r1547 */
/*!
Marek Rosa
Docs update after classes renaming
r1812 \qmlproperty real ValueAxis::min
Marek Rosa
Some docs to QValuesAxis
r1547 Defines the minimum value on the axis.
Marek Rosa
Updated min, max properties of values and datetime axes descriptions with information about maintaining the range validity
r1730 When setting this property the max is adjusted if necessary, to ensure that the range remains valid.
Marek Rosa
Some docs to QValuesAxis
r1547 */
/*!
Marek Rosa
class QValuesAxis renamed to QValueAxis
r1804 \property QValueAxis::max
Marek Rosa
Some docs to QValuesAxis
r1547 Defines the maximum value on the axis.
Marek Rosa
Updated min, max properties of values and datetime axes descriptions with information about maintaining the range validity
r1730 When setting this property the min is adjusted if necessary, to ensure that the range remains valid.
Marek Rosa
Some docs to QValuesAxis
r1547 */
/*!
Marek Rosa
Docs update after classes renaming
r1812 \qmlproperty real ValueAxis::max
Marek Rosa
Some docs to QValuesAxis
r1547 Defines the maximum value on the axis.
Marek Rosa
Updated min, max properties of values and datetime axes descriptions with information about maintaining the range validity
r1730 When setting this property the min is adjusted if necessary, to ensure that the range remains valid.
Marek Rosa
Some docs to QValuesAxis
r1547 */
Marek Rosa
Added docs for labelFormat in QValueAxis
r1855 /*!
\property QValueAxis::labelFormat
Defines the label format for the axis.
See QString::sprintf() for the details.
*/
/*!
\qmlproperty real ValueAxis::labelFormat
Defines the label format for the axis.
See QString::sprintf() for the details.
*/
Marek Rosa
Some docs to QValuesAxis
r1547 /*!
Marek Rosa
class QValuesAxis renamed to QValueAxis
r1804 \fn void QValueAxis::minChanged(qreal min)
Marek Rosa
Some docs to QValuesAxis
r1547 Axis emits signal when \a min of axis has changed.
*/
sauimone
abstract axis qml documentation. bug fix to setArrowVisible
r1654 /*!
Marek Rosa
Docs update after classes renaming
r1812 \qmlsignal ValueAxis::onMinChanged(real min)
sauimone
abstract axis qml documentation. bug fix to setArrowVisible
r1654 Axis emits signal when \a min of axis has changed.
*/
Marek Rosa
Some docs to QValuesAxis
r1547
/*!
Marek Rosa
class QValuesAxis renamed to QValueAxis
r1804 \fn void QValueAxis::maxChanged(qreal max)
Marek Rosa
Some docs to QValuesAxis
r1547 Axis emits signal when \a max of axis has changed.
*/
sauimone
abstract axis qml documentation. bug fix to setArrowVisible
r1654 /*!
Marek Rosa
Docs update after classes renaming
r1812 \qmlsignal ValueAxis::onMaxChanged(real max)
sauimone
abstract axis qml documentation. bug fix to setArrowVisible
r1654 Axis emits signal when \a max of axis has changed.
*/
Marek Rosa
Some docs to QValuesAxis
r1547
/*!
Marek Rosa
class QValuesAxis renamed to QValueAxis
r1804 \fn void QValueAxis::rangeChanged(qreal min, qreal max)
Marek Rosa
Some docs to QValuesAxis
r1547 Axis emits signal when \a min or \a max of axis has changed.
*/
Michal Klocek
Adds new API classes...
r1540
sauimone
fixed documentation errors
r1575 /*!
Marek Rosa
Docs update after classes renaming
r1812 \property QValueAxis::tickCount
sauimone
fixed documentation errors
r1575 The number of tick marks for the axis.
*/
/*!
Marek Rosa
Docs update after classes renaming
r1812 \qmlproperty int ValueAxis::tickCount
sauimone
fixed documentation errors
r1575 The number of tick marks for the axis.
*/
/*!
Marek Rosa
class QValuesAxis renamed to QValueAxis
r1804 \property QValueAxis::niceNumbersEnabled
sauimone
fixed documentation errors
r1575 Whether the nice numbers algorithm is enabled or not for the axis.
*/
/*!
Marek Rosa
Docs update after classes renaming
r1812 \qmlproperty bool ValueAxis::niceNumbersEnabled
sauimone
fixed documentation errors
r1575 Whether the nice numbers algorithm is enabled or not for the axis.
*/
Marek Rosa
Axes docs update
r1636 /*!
Constructs an axis object which is a child of \a parent.
*/
Marek Rosa
class QValuesAxis renamed to QValueAxis
r1804 QValueAxis::QValueAxis(QObject *parent) :
QAbstractAxis(*new QValueAxisPrivate(this),parent)
Michal Klocek
Adds new API classes...
r1540 {
}
Marek Rosa
Various docs fixes
r1638 /*!
\internal
*/
Marek Rosa
class QValuesAxis renamed to QValueAxis
r1804 QValueAxis::QValueAxis(QValueAxisPrivate &d,QObject *parent) : QAbstractAxis(d,parent)
Michal Klocek
Adds new API classes...
r1540 {
}
Marek Rosa
Various docs fixes
r1638 /*!
Destroys the object
*/
Marek Rosa
class QValuesAxis renamed to QValueAxis
r1804 QValueAxis::~QValueAxis()
Michal Klocek
Adds new API classes...
r1540 {
Marek Rosa
class QValuesAxis renamed to QValueAxis
r1804 Q_D(QValueAxis);
Michal Klocek
Implements qbarcategoriesaxis logic...
r1725 if(d->m_dataset) {
d->m_dataset->removeAxis(this);
}
Michal Klocek
Adds new API classes...
r1540 }
Marek Rosa
class QValuesAxis renamed to QValueAxis
r1804 void QValueAxis::setMin(qreal min)
Michal Klocek
Adds new API classes...
r1540 {
Marek Rosa
class QValuesAxis renamed to QValueAxis
r1804 Q_D(QValueAxis);
Marek Rosa
Ranges on values, intervals and datatime axes cannot be set to be invalid
r1728 setRange(min, qMax(d->m_max, min));
Michal Klocek
Adds new API classes...
r1540 }
Marek Rosa
class QValuesAxis renamed to QValueAxis
r1804 qreal QValueAxis::min() const
Michal Klocek
Adds new API classes...
r1540 {
Marek Rosa
class QValuesAxis renamed to QValueAxis
r1804 Q_D(const QValueAxis);
Michal Klocek
Adds new API classes...
r1540 return d->m_min;
}
Marek Rosa
class QValuesAxis renamed to QValueAxis
r1804 void QValueAxis::setMax(qreal max)
Michal Klocek
Adds new API classes...
r1540 {
Marek Rosa
class QValuesAxis renamed to QValueAxis
r1804 Q_D(QValueAxis);
Marek Rosa
Ranges on values, intervals and datatime axes cannot be set to be invalid
r1728 setRange(qMin(d->m_min, max), max);
Michal Klocek
Adds new API classes...
r1540 }
Marek Rosa
class QValuesAxis renamed to QValueAxis
r1804 qreal QValueAxis::max() const
Michal Klocek
Adds new API classes...
r1540 {
Marek Rosa
class QValuesAxis renamed to QValueAxis
r1804 Q_D(const QValueAxis);
Michal Klocek
Adds new API classes...
r1540 return d->m_max;
}
/*!
Sets range from \a min to \a max on the axis.
Marek Rosa
Updated min, max properties of values and datetime axes descriptions with information about maintaining the range validity
r1730 If min is greater than max then this function returns without making any changes.
Michal Klocek
Adds new API classes...
r1540 */
Marek Rosa
class QValuesAxis renamed to QValueAxis
r1804 void QValueAxis::setRange(qreal min, qreal max)
Michal Klocek
Adds new API classes...
r1540 {
Marek Rosa
class QValuesAxis renamed to QValueAxis
r1804 Q_D(QValueAxis);
sauimone
QAbstractAxis: variants strike back.
r1578 bool changed = false;
Michal Klocek
Refactors Domain and Axis...
r1698
Michal Klocek
Fixes nicenumbers missing update issue
r1738 if (min > max) return;
if(d->m_niceNumbers) {
int ticks = d->m_tickCount;
d->looseNiceNumbers(min, max, ticks);
Marek Rosa
QValueAxis ticksCount to tickCount
r1807 if(ticks!=d->m_tickCount) setTickCount(ticks);
Michal Klocek
Fixes nicenumbers missing update issue
r1738 }
Marek Rosa
Ranges on values, intervals and datatime axes cannot be set to be invalid
r1728
sauimone
QAbstractAxis: variants strike back.
r1578 if (!qFuzzyIsNull(d->m_min - min)) {
d->m_min = min;
changed = true;
emit minChanged(min);
}
if (!qFuzzyIsNull(d->m_max - max)) {
d->m_max = max;
changed = true;
emit maxChanged(max);
}
if (changed) {
Michal Klocek
Fixes nicenumbers missing update issue
r1738 emit rangeChanged(min,max);
Michal Klocek
Refactors Domain and Axis...
r1698 d->emitUpdated();
sauimone
QAbstractAxis: variants strike back.
r1578 }
Michal Klocek
Adds new API classes...
r1540 }
/*!
Sets \a count for ticks on the axis.
*/
Marek Rosa
QValueAxis ticksCount to tickCount
r1807 void QValueAxis::setTickCount(int count)
Michal Klocek
Adds new API classes...
r1540 {
Marek Rosa
class QValuesAxis renamed to QValueAxis
r1804 Q_D(QValueAxis);
Michal Klocek
Updates tst_qvaluesaxis test cases
r1700 if (d->m_tickCount != count && count >=2) {
Michal Klocek
Refactors Domain and Axis...
r1698 d->m_tickCount = count;
d->emitUpdated();
Michal Klocek
Adds new API classes...
r1540 }
}
/*!
Marek Rosa
Docs update after classes renaming
r1812 \fn int QValueAxis::tickCount() const
Michal Klocek
Adds new API classes...
r1540 Return number of ticks on the axis
*/
Marek Rosa
QValueAxis ticksCount to tickCount
r1807 int QValueAxis::tickCount() const
Michal Klocek
Adds new API classes...
r1540 {
Marek Rosa
class QValuesAxis renamed to QValueAxis
r1804 Q_D(const QValueAxis);
Michal Klocek
Refactors Domain and Axis...
r1698 return d->m_tickCount;
Michal Klocek
Adds new API classes...
r1540 }
Marek Rosa
class QValuesAxis renamed to QValueAxis
r1804 void QValueAxis::setNiceNumbersEnabled(bool enable)
Michal Klocek
Adds new API classes...
r1540 {
Marek Rosa
class QValuesAxis renamed to QValueAxis
r1804 Q_D(QValueAxis);
Michal Klocek
Adds new API classes...
r1540 if (d->m_niceNumbers != enable){
d->m_niceNumbers = enable;
Michal Klocek
Fixes nicenumbers missing update issue
r1738 if(enable && !qFuzzyIsNull(d->m_max - d->m_min)) {
setRange(d->m_min,d->m_max);
}
Michal Klocek
Adds new API classes...
r1540 }
}
Marek Rosa
class QValuesAxis renamed to QValueAxis
r1804 bool QValueAxis::niceNumbersEnabled() const
Michal Klocek
Adds new API classes...
r1540 {
Marek Rosa
class QValuesAxis renamed to QValueAxis
r1804 Q_D(const QValueAxis);
Michal Klocek
Adds new API classes...
r1540 return d->m_niceNumbers;
}
Marek Rosa
QValueAxis: added posibility to specify label format
r1854 void QValueAxis::setLabelFormat(const QString &format)
{
Q_D(QValueAxis);
d->m_format = format;
}
QString QValueAxis::labelFormat() const
{
Q_D(const QValueAxis);
return d->m_format;
}
Marek Rosa
Few more axes docs updates
r1637 /*!
Returns the type of the axis
*/
Marek Rosa
class QValuesAxis renamed to QValueAxis
r1804 QAbstractAxis::AxisType QValueAxis::type() const
Michal Klocek
Adds new API classes...
r1540 {
Marek Rosa
updated AxisType names
r1818 return AxisTypeValue;
Michal Klocek
Adds new API classes...
r1540 }
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Marek Rosa
class QValuesAxis renamed to QValueAxis
r1804 QValueAxisPrivate::QValueAxisPrivate(QValueAxis* q):
Michal Klocek
Adds new API classes...
r1540 QAbstractAxisPrivate(q),
Michal Klocek
Refactors Domain and Axis...
r1698 m_min(0),
m_max(0),
m_tickCount(5),
Marek Rosa
QValueAxis: added posibility to specify label format
r1854 m_niceNumbers(false),
Michal Klocek
Fix formating, do not show shit if no format set
r1889 m_format(QString::null)
Michal Klocek
Adds new API classes...
r1540 {
}
Marek Rosa
class QValuesAxis renamed to QValueAxis
r1804 QValueAxisPrivate::~QValueAxisPrivate()
Michal Klocek
Adds new API classes...
r1540 {
}
Marek Rosa
class QValuesAxis renamed to QValueAxis
r1804 void QValueAxisPrivate::handleDomainUpdated()
Michal Klocek
Adds new API classes...
r1540 {
Marek Rosa
class QValuesAxis renamed to QValueAxis
r1804 Q_Q(QValueAxis);
Michal Klocek
Refactors Domain and Axis...
r1698 Domain* domain = qobject_cast<Domain*>(sender());
Q_ASSERT(domain);
if(orientation()==Qt::Horizontal){
q->setRange(domain->minX(),domain->maxX());
}else if(orientation()==Qt::Vertical){
q->setRange(domain->minY(),domain->maxY());
}
Michal Klocek
Adds new API classes...
r1540 }
Michal Klocek
Refactors setMin setMax setRange to be pure viritual on private implementation
r1544
Marek Rosa
class QValuesAxis renamed to QValueAxis
r1804 void QValueAxisPrivate::setMin(const QVariant &min)
Michal Klocek
Refactors setMin setMax setRange to be pure viritual on private implementation
r1544 {
Marek Rosa
class QValuesAxis renamed to QValueAxis
r1804 Q_Q(QValueAxis);
sauimone
QAbstractAxis: variants strike back.
r1578 bool ok;
qreal value = min.toReal(&ok);
if(ok) q->setMin(value);
Michal Klocek
Refactors setMin setMax setRange to be pure viritual on private implementation
r1544 }
Marek Rosa
class QValuesAxis renamed to QValueAxis
r1804 void QValueAxisPrivate::setMax(const QVariant &max)
Michal Klocek
Refactors setMin setMax setRange to be pure viritual on private implementation
r1544 {
Michal Klocek
Fixes tst_qchartview
r1652
Marek Rosa
class QValuesAxis renamed to QValueAxis
r1804 Q_Q(QValueAxis);
sauimone
QAbstractAxis: variants strike back.
r1578 bool ok;
qreal value = max.toReal(&ok);
if(ok) q->setMax(value);
Michal Klocek
Refactors setMin setMax setRange to be pure viritual on private implementation
r1544 }
Marek Rosa
class QValuesAxis renamed to QValueAxis
r1804 void QValueAxisPrivate::setRange(const QVariant &min, const QVariant &max)
Michal Klocek
Refactors setMin setMax setRange to be pure viritual on private implementation
r1544 {
Marek Rosa
class QValuesAxis renamed to QValueAxis
r1804 Q_Q(QValueAxis);
sauimone
QAbstractAxis: variants strike back.
r1578 bool ok1;
bool ok2;
qreal value1 = min.toReal(&ok1);
qreal value2 = max.toReal(&ok2);
if(ok1&&ok2) q->setRange(value1,value2);
Michal Klocek
Refactors setMin setMax setRange to be pure viritual on private implementation
r1544 }
Marek Rosa
class QValuesAxis renamed to QValueAxis
r1804 ChartAxis* QValueAxisPrivate::createGraphics(ChartPresenter* presenter)
Michal Klocek
Refactors core to support mulitpile axis and domains...
r1556 {
Marek Rosa
class QValuesAxis renamed to QValueAxis
r1804 Q_Q(QValueAxis);
Michal Klocek
Refactors core to support mulitpile axis and domains...
r1556 if(m_orientation == Qt::Vertical){
Marek Rosa
renamed QValueAxis related files
r1805 return new ChartValueAxisY(q,presenter);
Michal Klocek
Refactors core to support mulitpile axis and domains...
r1556 }else{
Marek Rosa
renamed QValueAxis related files
r1805 return new ChartValueAxisX(q,presenter);
Michal Klocek
Refactors core to support mulitpile axis and domains...
r1556 }
}
Marek Rosa
class QValuesAxis renamed to QValueAxis
r1804 void QValueAxisPrivate::intializeDomain(Domain* domain)
Michal Klocek
Creates default initalization of axes
r1661 {
Marek Rosa
class QValuesAxis renamed to QValueAxis
r1804 Q_Q(QValueAxis);
sauimone
category axis initialization
r1662 if(qFuzzyCompare(m_max,m_min)) {
Michal Klocek
Creates default initalization of axes
r1661 if(m_orientation==Qt::Vertical){
Michal Klocek
Add autoscale testcases to tst_qvaluesaxis
r1705 q->setRange(domain->minY(),domain->maxY());
Michal Klocek
Creates default initalization of axes
r1661 }else{
Michal Klocek
Add autoscale testcases to tst_qvaluesaxis
r1705 q->setRange(domain->minX(), domain->maxX());
Michal Klocek
Creates default initalization of axes
r1661 }
Marek Rosa
Values and Intervals axes ranges are now initialized only if they haven't been preset earlier
r1703 } else {
if(m_orientation==Qt::Vertical){
domain->setRangeY(m_min, m_max);
}else{
domain->setRangeX(m_min, m_max);
}
Michal Klocek
Creates default initalization of axes
r1661 }
}
Michal Klocek
Refactors Domain and Axis...
r1698 //algorithm defined by Paul S.Heckbert GraphicalGems I
Marek Rosa
class QValuesAxis renamed to QValueAxis
r1804 void QValueAxisPrivate::looseNiceNumbers(qreal &min, qreal &max, int &ticksCount) const
Michal Klocek
Refactors Domain and Axis...
r1698 {
qreal range = niceNumber(max-min,true); //range with ceiling
qreal step = niceNumber(range/(ticksCount-1),false);
Michal Klocek
Implements qbarcategoriesaxis logic...
r1725 min = qFloor(min/step);
max = qCeil(max/step);
Michal Klocek
Refactors Domain and Axis...
r1698 ticksCount = int(max-min) +1;
min*=step;
max*=step;
}
//nice numbers can be expressed as form of 1*10^n, 2* 10^n or 5*10^n
Marek Rosa
class QValuesAxis renamed to QValueAxis
r1804 qreal QValueAxisPrivate::niceNumber(qreal x,bool ceiling) const
Michal Klocek
Refactors Domain and Axis...
r1698 {
Michal Klocek
Implements qbarcategoriesaxis logic...
r1725 qreal z = qPow(10,qFloor(log10(x))); //find corresponding number of the form of 10^n than is smaller than x
Michal Klocek
Refactors Domain and Axis...
r1698 qreal q = x/z;//q<10 && q>=1;
if(ceiling) {
if(q <= 1.0) q=1;
else if(q <= 2.0) q=2;
else if(q <= 5.0) q=5;
else q=10;
}
else {
if(q < 1.5) q=1;
else if(q < 3.0) q=2;
else if(q < 7.0) q=5;
else q=10;
}
return q*z;
}
Marek Rosa
renamed QValueAxis related files
r1805 #include "moc_qvalueaxis.cpp"
#include "moc_qvalueaxis_p.cpp"
Michal Klocek
Adds new API classes...
r1540
QTCOMMERCIALCHART_END_NAMESPACE