QHeaderView: fix assert when restoring section sizes over less columns

If columns are removed and we get notified via layoutChanged, the code
tries to restore old section sizes, and went out of bounds, leading to
an assert in QVector. Simply add an if() to skip restoring out-of-bounds columns.

This comes from https://bugs.kde.org/show_bug.cgi?id=395181,
which translates into the unittest that is part of this commit.

Change-Id: Ide42176a758f87b21957c40508127d67f1d5a2d9
Reviewed-by: Christian Ehrlicher <ch.ehrlicher@gmx.de>
Reviewed-by: Thorbjørn Lund Martsum <tmartsum@gmail.com>
bb10
David Faure 2019-04-13 19:37:37 +02:00
parent 49be1a3c1f
commit ba6e0e4aac
2 changed files with 25 additions and 6 deletions

View File

@ -2283,13 +2283,15 @@ void QHeaderViewPrivate::_q_sectionsChanged(const QList<QPersistentModelIndex> &
: index.row());
// the new visualIndices are already adjusted / reset by initializeSections()
const int newVisualIndex = visualIndex(newLogicalIndex);
auto &newSection = sectionItems[newVisualIndex];
newSection = item.section;
if (newVisualIndex < sectionItems.count()) {
auto &newSection = sectionItems[newVisualIndex];
newSection = item.section;
if (newSection.isHidden) {
// otherwise setSectionHidden will return without doing anything
newSection.isHidden = false;
q->setSectionHidden(newLogicalIndex, true);
if (newSection.isHidden) {
// otherwise setSectionHidden will return without doing anything
newSection.isHidden = false;
q->setSectionHidden(newLogicalIndex, true);
}
}
}

View File

@ -248,6 +248,7 @@ private slots:
void sizeHintCrash();
void testResetCachedSizeHint();
void statusTips();
void testRemovingColumnsViaLayoutChanged();
protected:
void setupTestData(bool use_reset_model = false);
@ -353,6 +354,7 @@ public:
void cleanup()
{
emit layoutAboutToBeChanged();
cols = 3;
rows = 3;
emit layoutChanged();
@ -3489,5 +3491,20 @@ void tst_QHeaderView::statusTips()
QCOMPARE(headerView.statusTipText, QLatin1String("[0,1,0] -- Header"));
}
void tst_QHeaderView::testRemovingColumnsViaLayoutChanged()
{
const int persistentSectionSize = 101;
QtTestModel model;
model.rows = model.cols = 5;
view->setModel(&model);
for (int i = 0; i < model.cols; ++i)
view->resizeSection(i, persistentSectionSize + i);
model.cleanup(); // down to 3 via layoutChanged (not columnsRemoved)
for (int j = 0; j < model.cols; ++j)
QCOMPARE(view->sectionSize(j), persistentSectionSize + j);
// The main point of this test is that the section-size restoring code didn't go out of bounds.
}
QTEST_MAIN(tst_QHeaderView)
#include "tst_qheaderview.moc"