4a04eea4.patch 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. From 4a04eea4f4316684e20c509352c6c533cf39306e Mon Sep 17 00:00:00 2001
  2. From: David Faure <david.faure@kdab.com>
  3. Date: Thu, 1 Mar 2018 11:04:00 +0100
  4. Subject: QHeaderView: fix inconsistent saved state, ignored during restore
  5. MIME-Version: 1.0
  6. Content-Type: text/plain; charset=UTF-8
  7. Content-Transfer-Encoding: 8bit
  8. The code that updates a section size must also update length,
  9. otherwise saveState can end up saving inconsistent state, and
  10. restoreState() goes to an early-return, not doing anything.
  11. The actual bug was fixed meanwhile because _q_sectionsChanged is called
  12. again, which recalculates length. I still see this only as a safety
  13. measure, every other code path that changes section sizes updates length
  14. right away.
  15. Change-Id: I6cc16261692d93b3640afafef600a5bdff8dca0c
  16. Reviewed-by: Thorbjørn Lund Martsum <tmartsum@gmail.com>
  17. ---
  18. src/widgets/itemviews/qheaderview.cpp | 6 ++-
  19. .../widgets/itemviews/qtreeview/tst_qtreeview.cpp | 53 ++++++++++++++++++++++
  20. 2 files changed, 58 insertions(+), 1 deletion(-)
  21. diff --git a/src/widgets/itemviews/qheaderview.cpp b/src/widgets/itemviews/qheaderview.cpp
  22. index 5cbf642802..b7048d1616 100644
  23. --- a/src/widgets/itemviews/qheaderview.cpp
  24. +++ b/src/widgets/itemviews/qheaderview.cpp
  25. @@ -2191,7 +2191,11 @@ void QHeaderViewPrivate::_q_sectionsAboutToBeChanged(const QList<QPersistentMode
  26. if (stretchLastSection && lastSectionLogicalIdx >= 0 && lastSectionLogicalIdx < sectionItems.count()) {
  27. const int visual = visualIndex(lastSectionLogicalIdx);
  28. if (visual >= 0 && visual < sectionItems.size()) {
  29. - sectionItems[visual].size = lastSectionSize;
  30. + auto &itemRef = sectionItems[visual];
  31. + if (itemRef.size != lastSectionSize) {
  32. + length += lastSectionSize - itemRef.size;
  33. + itemRef.size = lastSectionSize;
  34. + }
  35. }
  36. }
  37. for (int i = 0; i < sectionItems.size(); ++i) {
  38. diff --git a/tests/auto/widgets/itemviews/qtreeview/tst_qtreeview.cpp b/tests/auto/widgets/itemviews/qtreeview/tst_qtreeview.cpp
  39. index 5293ba487a..347d2a81e6 100644
  40. --- a/tests/auto/widgets/itemviews/qtreeview/tst_qtreeview.cpp
  41. +++ b/tests/auto/widgets/itemviews/qtreeview/tst_qtreeview.cpp
  42. @@ -162,6 +162,7 @@ private slots:
  43. void renderToPixmap();
  44. void styleOptionViewItem();
  45. void keyboardNavigationWithDisabled();
  46. + void saveRestoreState();
  47. void statusTip_data();
  48. void statusTip();
  49. @@ -4076,6 +4077,58 @@ void tst_QTreeView::keyboardNavigationWithDisabled()
  50. QCOMPARE(view.currentIndex(), model.index(6, 0));
  51. }
  52. +class RemoveColumnOne : public QSortFilterProxyModel
  53. +{
  54. +public:
  55. + bool filterAcceptsColumn(int source_column, const QModelIndex &) const override
  56. + {
  57. + if (m_removeColumn)
  58. + return source_column != 1;
  59. + return true;
  60. + }
  61. + void removeColumn()
  62. + {
  63. + m_removeColumn = true;
  64. + invalidate();
  65. + }
  66. +private:
  67. + bool m_removeColumn = false;
  68. +};
  69. +
  70. +
  71. +void tst_QTreeView::saveRestoreState()
  72. +{
  73. + QStandardItemModel model;
  74. + for (int i = 0; i < 100; i++) {
  75. + QList<QStandardItem *> items;
  76. + items << new QStandardItem(QLatin1String("item ") + QString::number(i)) << new QStandardItem(QStringLiteral("hidden by proxy")) << new QStandardItem(QStringLiteral("hidden by user"));
  77. + model.appendRow(items);
  78. + }
  79. + QCOMPARE(model.columnCount(), 3);
  80. +
  81. + RemoveColumnOne proxy;
  82. + proxy.setSourceModel(&model);
  83. + QCOMPARE(proxy.columnCount(), 3);
  84. +
  85. + QTreeView view;
  86. + view.setModel(&proxy);
  87. + view.resize(500, 500);
  88. + view.show();
  89. + view.header()->hideSection(2);
  90. + QVERIFY(view.header()->isSectionHidden(2));
  91. + proxy.removeColumn();
  92. + QCOMPARE(proxy.columnCount(), 2);
  93. + QVERIFY(view.header()->isSectionHidden(1));
  94. + const QByteArray data = view.header()->saveState();
  95. +
  96. + QTreeView view2;
  97. + view2.setModel(&proxy);
  98. + view2.resize(500, 500);
  99. + view2.show();
  100. + view2.header()->restoreState(data);
  101. + QVERIFY(view2.header()->isSectionHidden(1));
  102. +}
  103. +
  104. class Model_11466 : public QAbstractItemModel
  105. {
  106. Q_OBJECT
  107. --
  108. cgit v1.2.1