diff options
author | Miikka Heikkinen <miikka.heikkinen@qt.io> | 2016-08-26 15:53:02 +0300 |
---|---|---|
committer | Miikka Heikkinen <miikka.heikkinen@qt.io> | 2016-09-19 10:51:01 +0000 |
commit | 105d75533d31ceee0c39ef9e084294ed49ecbd89 (patch) | |
tree | 4d2a73a1974d8ccd79d027ab19f8d4143909b458 /src/charts/barchart/qabstractbarseries.cpp | |
parent | ced3a47d266938fd73a4b45f56cca4847cbb6967 (diff) |
Optimize barcharts painting
Previously, bar charts used to recreate the bar chart visuals from
scratch whenever any change to the bar data occurred.
The following changes were made:
- Graphics items are generated only for visible bars and labels
- Graphics items are reused if layout or data changes
- Labels are not generated unless they are visible
- Only newly added bars are animated from scratch; existing bars
will retain their size, making things more visually pleasing.
With these optimizations, the size of the bar series is irrelevant
to the painting performance, only thing that matters is how many
bars and labels are actually within visible range.
Task-number: QTBUG-52442
Change-Id: If3199a86e6819ef6219d2eb5f06d729c0bdbd2ae
Reviewed-by: Tomi Korpipää <tomi.korpipaa@qt.io>
Reviewed-by: Miikka Heikkinen <miikka.heikkinen@qt.io>
Diffstat (limited to 'src/charts/barchart/qabstractbarseries.cpp')
-rw-r--r-- | src/charts/barchart/qabstractbarseries.cpp | 82 |
1 files changed, 66 insertions, 16 deletions
diff --git a/src/charts/barchart/qabstractbarseries.cpp b/src/charts/barchart/qabstractbarseries.cpp index 844b21e3..1b371feb 100644 --- a/src/charts/barchart/qabstractbarseries.cpp +++ b/src/charts/barchart/qabstractbarseries.cpp @@ -549,6 +549,7 @@ void QAbstractBarSeries::setLabelsFormat(const QString &format) Q_D(QAbstractBarSeries); if (d->m_labelsFormat != format) { d->m_labelsFormat = format; + d->setLabelsDirty(true); emit labelsFormatChanged(format); } } @@ -564,6 +565,7 @@ void QAbstractBarSeries::setLabelsAngle(qreal angle) Q_D(QAbstractBarSeries); if (d->m_labelsAngle != angle) { d->m_labelsAngle = angle; + d->setLabelsDirty(true); emit labelsAngleChanged(angle); } } @@ -599,7 +601,9 @@ QAbstractBarSeriesPrivate::QAbstractBarSeriesPrivate(QAbstractBarSeries *q) : m_blockBarUpdate(false), m_labelsFormat(), m_labelsPosition(QAbstractBarSeries::LabelsCenter), - m_labelsAngle(0) + m_labelsAngle(0), + m_visualsDirty(true), + m_labelsDirty(true) { } @@ -885,9 +889,14 @@ bool QAbstractBarSeriesPrivate::append(QBarSet *set) return false; // Fail if set is already in list or set is null. m_barSets.append(set); - QObject::connect(set->d_ptr.data(), SIGNAL(updatedLayout()), this, SIGNAL(updatedLayout())); - QObject::connect(set->d_ptr.data(), SIGNAL(updatedBars()), this, SIGNAL(updatedBars())); - QObject::connect(set->d_ptr.data(), SIGNAL(restructuredBars()), this, SIGNAL(restructuredBars())); + QObject::connect(set->d_ptr.data(), &QBarSetPrivate::updatedBars, + this, &QAbstractBarSeriesPrivate::updatedBars); + QObject::connect(set->d_ptr.data(), &QBarSetPrivate::valueChanged, + this, &QAbstractBarSeriesPrivate::handleSetValueChange); + QObject::connect(set->d_ptr.data(), &QBarSetPrivate::valueAdded, + this, &QAbstractBarSeriesPrivate::handleSetValueAdd); + QObject::connect(set->d_ptr.data(), &QBarSetPrivate::valueRemoved, + this, &QAbstractBarSeriesPrivate::handleSetValueRemove); emit restructuredBars(); // this notifies barchartitem return true; @@ -899,9 +908,14 @@ bool QAbstractBarSeriesPrivate::remove(QBarSet *set) return false; // Fail if set is not in list m_barSets.removeOne(set); - QObject::disconnect(set->d_ptr.data(), SIGNAL(updatedLayout()), this, SIGNAL(updatedLayout())); - QObject::disconnect(set->d_ptr.data(), SIGNAL(updatedBars()), this, SIGNAL(updatedBars())); - QObject::disconnect(set->d_ptr.data(), SIGNAL(restructuredBars()), this, SIGNAL(restructuredBars())); + QObject::disconnect(set->d_ptr.data(), &QBarSetPrivate::updatedBars, + this, &QAbstractBarSeriesPrivate::updatedBars); + QObject::disconnect(set->d_ptr.data(), &QBarSetPrivate::valueChanged, + this, &QAbstractBarSeriesPrivate::handleSetValueChange); + QObject::disconnect(set->d_ptr.data(), &QBarSetPrivate::valueAdded, + this, &QAbstractBarSeriesPrivate::handleSetValueAdd); + QObject::disconnect(set->d_ptr.data(), &QBarSetPrivate::valueRemoved, + this, &QAbstractBarSeriesPrivate::handleSetValueRemove); emit restructuredBars(); // this notifies barchartitem return true; @@ -918,9 +932,14 @@ bool QAbstractBarSeriesPrivate::append(QList<QBarSet * > sets) foreach (QBarSet *set, sets) { m_barSets.append(set); - QObject::connect(set->d_ptr.data(), SIGNAL(updatedLayout()), this, SIGNAL(updatedLayout())); - QObject::connect(set->d_ptr.data(), SIGNAL(updatedBars()), this, SIGNAL(updatedBars())); - QObject::connect(set->d_ptr.data(), SIGNAL(restructuredBars()), this, SIGNAL(restructuredBars())); + QObject::connect(set->d_ptr.data(), &QBarSetPrivate::updatedBars, + this, &QAbstractBarSeriesPrivate::updatedBars); + QObject::connect(set->d_ptr.data(), &QBarSetPrivate::valueChanged, + this, &QAbstractBarSeriesPrivate::handleSetValueChange); + QObject::connect(set->d_ptr.data(), &QBarSetPrivate::valueAdded, + this, &QAbstractBarSeriesPrivate::handleSetValueAdd); + QObject::connect(set->d_ptr.data(), &QBarSetPrivate::valueRemoved, + this, &QAbstractBarSeriesPrivate::handleSetValueRemove); } emit restructuredBars(); // this notifies barchartitem @@ -941,9 +960,14 @@ bool QAbstractBarSeriesPrivate::remove(QList<QBarSet * > sets) foreach (QBarSet *set, sets) { m_barSets.removeOne(set); - QObject::disconnect(set->d_ptr.data(), SIGNAL(updatedLayout()), this, SIGNAL(updatedLayout())); - QObject::disconnect(set->d_ptr.data(), SIGNAL(updatedBars()), this, SIGNAL(updatedBars())); - QObject::disconnect(set->d_ptr.data(), SIGNAL(restructuredBars()), this, SIGNAL(restructuredBars())); + QObject::disconnect(set->d_ptr.data(), &QBarSetPrivate::updatedBars, + this, &QAbstractBarSeriesPrivate::updatedBars); + QObject::disconnect(set->d_ptr.data(), &QBarSetPrivate::valueChanged, + this, &QAbstractBarSeriesPrivate::handleSetValueChange); + QObject::disconnect(set->d_ptr.data(), &QBarSetPrivate::valueAdded, + this, &QAbstractBarSeriesPrivate::handleSetValueAdd); + QObject::disconnect(set->d_ptr.data(), &QBarSetPrivate::valueRemoved, + this, &QAbstractBarSeriesPrivate::handleSetValueRemove); } emit restructuredBars(); // this notifies barchartitem @@ -957,9 +981,14 @@ bool QAbstractBarSeriesPrivate::insert(int index, QBarSet *set) return false; // Fail if set is already in list or set is null. m_barSets.insert(index, set); - QObject::connect(set->d_ptr.data(), SIGNAL(updatedLayout()), this, SIGNAL(updatedLayout())); - QObject::connect(set->d_ptr.data(), SIGNAL(updatedBars()), this, SIGNAL(updatedBars())); - QObject::connect(set->d_ptr.data(), SIGNAL(restructuredBars()), this, SIGNAL(restructuredBars())); + QObject::connect(set->d_ptr.data(), &QBarSetPrivate::updatedBars, + this, &QAbstractBarSeriesPrivate::updatedBars); + QObject::connect(set->d_ptr.data(), &QBarSetPrivate::valueChanged, + this, &QAbstractBarSeriesPrivate::handleSetValueChange); + QObject::connect(set->d_ptr.data(), &QBarSetPrivate::valueAdded, + this, &QAbstractBarSeriesPrivate::handleSetValueAdd); + QObject::connect(set->d_ptr.data(), &QBarSetPrivate::valueRemoved, + this, &QAbstractBarSeriesPrivate::handleSetValueRemove); emit restructuredBars(); // this notifies barchartitem return true; @@ -1022,6 +1051,27 @@ QAbstractAxis::AxisType QAbstractBarSeriesPrivate::defaultAxisType(Qt::Orientati } +void QAbstractBarSeriesPrivate::handleSetValueChange(int index) +{ + QBarSetPrivate *priv = qobject_cast<QBarSetPrivate *>(sender()); + if (priv) + emit setValueChanged(index, priv->q_ptr); +} + +void QAbstractBarSeriesPrivate::handleSetValueAdd(int index, int count) +{ + QBarSetPrivate *priv = qobject_cast<QBarSetPrivate *>(sender()); + if (priv) + emit setValueAdded(index, count, priv->q_ptr); +} + +void QAbstractBarSeriesPrivate::handleSetValueRemove(int index, int count) +{ + QBarSetPrivate *priv = qobject_cast<QBarSetPrivate *>(sender()); + if (priv) + emit setValueRemoved(index, count, priv->q_ptr); +} + void QAbstractBarSeriesPrivate::populateCategories(QBarCategoryAxis *axis) { QStringList categories; |