From 05751a7e75da5e4634afccee23076c0dac2ce8b0 Mon Sep 17 00:00:00 2001 From: Jan Arve Saether Date: Tue, 5 Mar 2013 11:47:05 +0100 Subject: Fixed QTreeWidgetIterator to work with sorted QTreeWidget MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit We cannot access children directly, since that won't ensure that the pending sort is executed. However, the functions we need are there already and actually makes the code nicer. Task-number: QTBUG-29903 Change-Id: I6899284275dd79b991896a5f08486b58d95f819d Reviewed-by: Gabriel de Dietrich (cherry picked from qtbase/aa2d10750ad8cdb6a86d519063664c2924b2a635) Reviewed-by: Jan Arve Sæther --- src/gui/itemviews/qtreewidgetitemiterator.cpp | 9 ++++---- .../tst_qtreewidgetitemiterator.cpp | 27 ++++++++++++++++++++++ 2 files changed, 31 insertions(+), 5 deletions(-) diff --git a/src/gui/itemviews/qtreewidgetitemiterator.cpp b/src/gui/itemviews/qtreewidgetitemiterator.cpp index ea98884..66dbdf5 100644 --- a/src/gui/itemviews/qtreewidgetitemiterator.cpp +++ b/src/gui/itemviews/qtreewidgetitemiterator.cpp @@ -99,7 +99,7 @@ QTreeWidgetItemIterator::QTreeWidgetItemIterator(QTreeWidget *widget, IteratorFl Q_ASSERT(model); d_ptr.reset(new QTreeWidgetItemIteratorPrivate(this, model)); model->iterators.append(this); - if (!model->rootItem->children.isEmpty()) current = model->rootItem->children.first(); + if (!model->rootItem->children.isEmpty()) current = model->rootItem->child(0); if (current && !matchesFlags(current)) ++(*this); } @@ -128,14 +128,13 @@ QTreeWidgetItemIterator::QTreeWidgetItemIterator(QTreeWidgetItem *item, Iterator // the beginning. QTreeWidgetItem *parent = item; parent = parent->parent(); - QList children = parent ? parent->children : d->m_model->rootItem->children; - d->m_currentIndex = children.indexOf(item); + QTreeWidgetItem *root = d->m_model->rootItem; + d->m_currentIndex = (parent ? parent : root)->indexOfChild(item); while (parent) { QTreeWidgetItem *itm = parent; parent = parent->parent(); - QList children = parent ? parent->children : d->m_model->rootItem->children; - int index = children.indexOf(itm); + const int index = (parent ? parent : root)->indexOfChild(itm); d->m_parentIndex.prepend(index); } diff --git a/tests/auto/qtreewidgetitemiterator/tst_qtreewidgetitemiterator.cpp b/tests/auto/qtreewidgetitemiterator/tst_qtreewidgetitemiterator.cpp index 64a6b5b..6c2bafa 100644 --- a/tests/auto/qtreewidgetitemiterator/tst_qtreewidgetitemiterator.cpp +++ b/tests/auto/qtreewidgetitemiterator/tst_qtreewidgetitemiterator.cpp @@ -83,6 +83,7 @@ private slots: void updateIteratorAfterDeletedItem_and_ContinueIteration_data(); void updateIteratorAfterDeletedItem_and_ContinueIteration(); void initializeIterator(); + void sortingEnabled(); private: QTreeWidget *testWidget; }; @@ -1239,5 +1240,31 @@ void tst_QTreeWidgetItemIterator::initializeIterator() QCOMPARE((*it), static_cast(0)); } +void tst_QTreeWidgetItemIterator::sortingEnabled() +{ + QTreeWidget *tree = new QTreeWidget; + tree->setColumnCount(2); + tree->headerItem()->setText(0, "Id"); + tree->headerItem()->setText(1, "Color"); + + tree->setSortingEnabled(true); + tree->sortByColumn(0, Qt::AscendingOrder); + + QTreeWidgetItem *second = new QTreeWidgetItem; + second->setText(0, "2"); + second->setText(1, "second"); + QTreeWidgetItem *first = new QTreeWidgetItem; + first->setText(0, "1"); + first->setText(1, "first"); + + tree->addTopLevelItem(second); + tree->addTopLevelItem(first); + + QTreeWidgetItemIterator it(tree); + QCOMPARE(*it, first); + ++it; + QCOMPARE(*it, second); +} + QTEST_MAIN(tst_QTreeWidgetItemIterator) #include "tst_qtreewidgetitemiterator.moc" -- cgit v0.12