123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116 |
- From 4a04eea4f4316684e20c509352c6c533cf39306e Mon Sep 17 00:00:00 2001
- From: David Faure <david.faure@kdab.com>
- Date: Thu, 1 Mar 2018 11:04:00 +0100
- Subject: QHeaderView: fix inconsistent saved state, ignored during restore
- MIME-Version: 1.0
- Content-Type: text/plain; charset=UTF-8
- Content-Transfer-Encoding: 8bit
- The code that updates a section size must also update length,
- otherwise saveState can end up saving inconsistent state, and
- restoreState() goes to an early-return, not doing anything.
- The actual bug was fixed meanwhile because _q_sectionsChanged is called
- again, which recalculates length. I still see this only as a safety
- measure, every other code path that changes section sizes updates length
- right away.
- Change-Id: I6cc16261692d93b3640afafef600a5bdff8dca0c
- Reviewed-by: Thorbjørn Lund Martsum <tmartsum@gmail.com>
- ---
- src/widgets/itemviews/qheaderview.cpp | 6 ++-
- .../widgets/itemviews/qtreeview/tst_qtreeview.cpp | 53 ++++++++++++++++++++++
- 2 files changed, 58 insertions(+), 1 deletion(-)
- diff --git a/src/widgets/itemviews/qheaderview.cpp b/src/widgets/itemviews/qheaderview.cpp
- index 5cbf642802..b7048d1616 100644
- --- a/src/widgets/itemviews/qheaderview.cpp
- +++ b/src/widgets/itemviews/qheaderview.cpp
- @@ -2191,7 +2191,11 @@ void QHeaderViewPrivate::_q_sectionsAboutToBeChanged(const QList<QPersistentMode
- if (stretchLastSection && lastSectionLogicalIdx >= 0 && lastSectionLogicalIdx < sectionItems.count()) {
- const int visual = visualIndex(lastSectionLogicalIdx);
- if (visual >= 0 && visual < sectionItems.size()) {
- - sectionItems[visual].size = lastSectionSize;
- + auto &itemRef = sectionItems[visual];
- + if (itemRef.size != lastSectionSize) {
- + length += lastSectionSize - itemRef.size;
- + itemRef.size = lastSectionSize;
- + }
- }
- }
- for (int i = 0; i < sectionItems.size(); ++i) {
- diff --git a/tests/auto/widgets/itemviews/qtreeview/tst_qtreeview.cpp b/tests/auto/widgets/itemviews/qtreeview/tst_qtreeview.cpp
- index 5293ba487a..347d2a81e6 100644
- --- a/tests/auto/widgets/itemviews/qtreeview/tst_qtreeview.cpp
- +++ b/tests/auto/widgets/itemviews/qtreeview/tst_qtreeview.cpp
- @@ -162,6 +162,7 @@ private slots:
- void renderToPixmap();
- void styleOptionViewItem();
- void keyboardNavigationWithDisabled();
- + void saveRestoreState();
-
- void statusTip_data();
- void statusTip();
- @@ -4076,6 +4077,58 @@ void tst_QTreeView::keyboardNavigationWithDisabled()
- QCOMPARE(view.currentIndex(), model.index(6, 0));
- }
-
- +class RemoveColumnOne : public QSortFilterProxyModel
- +{
- +public:
- + bool filterAcceptsColumn(int source_column, const QModelIndex &) const override
- + {
- + if (m_removeColumn)
- + return source_column != 1;
- + return true;
- + }
- + void removeColumn()
- + {
- + m_removeColumn = true;
- + invalidate();
- + }
- +private:
- + bool m_removeColumn = false;
- +};
- +
- +
- +void tst_QTreeView::saveRestoreState()
- +{
- + QStandardItemModel model;
- + for (int i = 0; i < 100; i++) {
- + QList<QStandardItem *> items;
- + items << new QStandardItem(QLatin1String("item ") + QString::number(i)) << new QStandardItem(QStringLiteral("hidden by proxy")) << new QStandardItem(QStringLiteral("hidden by user"));
- + model.appendRow(items);
- + }
- + QCOMPARE(model.columnCount(), 3);
- +
- + RemoveColumnOne proxy;
- + proxy.setSourceModel(&model);
- + QCOMPARE(proxy.columnCount(), 3);
- +
- + QTreeView view;
- + view.setModel(&proxy);
- + view.resize(500, 500);
- + view.show();
- + view.header()->hideSection(2);
- + QVERIFY(view.header()->isSectionHidden(2));
- + proxy.removeColumn();
- + QCOMPARE(proxy.columnCount(), 2);
- + QVERIFY(view.header()->isSectionHidden(1));
- + const QByteArray data = view.header()->saveState();
- +
- + QTreeView view2;
- + view2.setModel(&proxy);
- + view2.resize(500, 500);
- + view2.show();
- + view2.header()->restoreState(data);
- + QVERIFY(view2.header()->isSectionHidden(1));
- +}
- +
- class Model_11466 : public QAbstractItemModel
- {
- Q_OBJECT
- --
- cgit v1.2.1
|