diff options
author | Sami Varanka <sami.varanka@qt.io> | 2024-04-28 19:25:51 +0300 |
---|---|---|
committer | Sami Varanka <sami.varanka@qt.io> | 2024-05-06 10:24:18 +0300 |
commit | 805ba144e68dc300ae878f839b9cd7bce63fdcb0 (patch) | |
tree | 4f36d857a39ad66921ee222a9334f8c6583dc6cc | |
parent | 6b1b6eade584cead849965065a7a1cde05840cc6 (diff) |
Delete extra bar rectangles
Internal rectangle reprentations were never freed which caused
them to be left visible when the set was removed from the series.
Fixes: QTBUG-124812
Change-Id: Id541c1ad2231456876fb9ebaf47e4c7e13b98d9d
Reviewed-by: Tomi Korpipää <tomi.korpipaa@qt.io>
Reviewed-by: Kwanghyo Park <kwanghyo.park@qt.io>
-rw-r--r-- | src/graphs2d/barchart/qbarseries.cpp | 3 | ||||
-rw-r--r-- | src/graphs2d/qabstractseries.cpp | 11 | ||||
-rw-r--r-- | src/graphs2d/qabstractseries_p.h | 1 | ||||
-rw-r--r-- | src/graphs2d/qsgrenderer/barsrenderer.cpp | 23 |
4 files changed, 32 insertions, 6 deletions
diff --git a/src/graphs2d/barchart/qbarseries.cpp b/src/graphs2d/barchart/qbarseries.cpp index abd5d14..a5637f8 100644 --- a/src/graphs2d/barchart/qbarseries.cpp +++ b/src/graphs2d/barchart/qbarseries.cpp @@ -526,8 +526,8 @@ bool QBarSeries::append(QBarSet *set) QObject::connect(set, &QBarSet::update, this, &QBarSeries::update); emit barsetsAdded(sets); emit countChanged(); + emit update(); } - emit update(); return success; } @@ -546,6 +546,7 @@ bool QBarSeries::remove(QBarSet *set) QObject::disconnect(set, &QBarSet::update, this, &QBarSeries::update); emit barsetsRemoved(sets); emit countChanged(); + emit update(); delete set; set = 0; } diff --git a/src/graphs2d/qabstractseries.cpp b/src/graphs2d/qabstractseries.cpp index cc2d182..0fa9ae9 100644 --- a/src/graphs2d/qabstractseries.cpp +++ b/src/graphs2d/qabstractseries.cpp @@ -515,13 +515,22 @@ QAbstractSeriesPrivate::~QAbstractSeriesPrivate() void QAbstractSeriesPrivate::setLegendData(const QList<QLegendData> &legendData) { - Q_Q(QAbstractSeries); if (legendData.data() != m_legendData.data()) { + Q_Q(QAbstractSeries); m_legendData = legendData; emit q->legendDataChanged(); } } +void QAbstractSeriesPrivate::clearLegendData() +{ + if (!m_legendData.empty()) { + Q_Q(QAbstractSeries); + m_legendData.clear(); + emit q->legendDataChanged(); + } +} + QT_END_NAMESPACE #include "moc_qabstractseries.cpp" diff --git a/src/graphs2d/qabstractseries_p.h b/src/graphs2d/qabstractseries_p.h index 196b6a0..1af0db3 100644 --- a/src/graphs2d/qabstractseries_p.h +++ b/src/graphs2d/qabstractseries_p.h @@ -33,6 +33,7 @@ public: virtual void initializeAxes(){}; void setLegendData(const QList<QLegendData> &legendData); + void clearLegendData(); protected: QGraphsView *m_graph; diff --git a/src/graphs2d/qsgrenderer/barsrenderer.cpp b/src/graphs2d/qsgrenderer/barsrenderer.cpp index afa7801..4bdc2fc 100644 --- a/src/graphs2d/qsgrenderer/barsrenderer.cpp +++ b/src/graphs2d/qsgrenderer/barsrenderer.cpp @@ -222,6 +222,7 @@ void BarsRenderer::updateVerticalBars(QBarSeries *series, int setCount, int valu // Clear the selection rects // These will be filled only if series is selectable m_rectNodesInputRects.clear(); + m_seriesData.clear(); float seriesPos = 0; float posXInSet = 0; @@ -333,6 +334,7 @@ void BarsRenderer::updateHorizontalBars(QBarSeries *series, int setCount, int va // Clear the selection rects // These will be filled only if series is selectable m_rectNodesInputRects.clear(); + m_seriesData.clear(); float seriesPos = 0; float posYInSet = 0; @@ -426,8 +428,10 @@ void BarsRenderer::handlePolish(QBarSeries *series) return; int setCount = series->barSets().size(); - if (setCount == 0) + if (setCount == 0) { + series->d_func()->clearLegendData(); return; + } if (m_colorIndex < 0) @@ -454,22 +458,33 @@ void BarsRenderer::handlePolish(QBarSeries *series) void BarsRenderer::updateSeries(QBarSeries *series) { - if (series->barSets().isEmpty()) + if (series->barSets().isEmpty()) { + auto it = m_rectNodes.begin(); + while (it != m_rectNodes.end()) + delete *it++; + m_rectNodes.clear(); return; + } auto seriesTheme = series->theme(); if (!seriesTheme) return; + int difference = m_seriesData.size() - m_rectNodes.size(); + for (int i = m_rectNodes.size() - 1; i >= m_seriesData.size(); --i) + delete m_rectNodes[i]; + if (difference != 0) + m_rectNodes.resize(m_seriesData.size()); + if (!series->barComponent()) { // Update default rectangle nodes int barIndex = 0; for (auto i = m_seriesData.cbegin(), end = m_seriesData.cend(); i != end; ++i) { - if (m_rectNodes.size() <= barIndex) { + if (m_rectNodes[barIndex] == nullptr) { // Create more rectangle nodes as needed auto bi = new QSGDefaultInternalRectangleNode(); m_graph->m_backgroundNode->appendChildNode(bi); - m_rectNodes << bi; + m_rectNodes[barIndex] = bi; } if (m_rectNodes.size() > barIndex) { auto &barItem = m_rectNodes[barIndex]; |