QAbstractItemView: Don't unselect on click on empty area in SingleSelect

dfb4697e4a made a change to selection
behavior that resulted in a regression where clicking on an item view
but not on an item would cause the current item to get unselected.
Changes the behavior to not update in this case.

Added a new test that specifially checks for this scenario and ensures
that the current item is still selected, even after the user clicks on
empty area.

Fixes: QTBUG-105870
Pick-to: 6.2 6.4 6.5
Change-Id: I191c3878819b99897083039fba0ab43908da5429
Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
This commit is contained in:
Sebastian Beckmann 2023-02-09 21:05:20 +01:00 committed by Volker Hilsheimer
parent 9b30774ad3
commit f11e5435c7
2 changed files with 37 additions and 1 deletions

View File

@ -4093,8 +4093,12 @@ QItemSelectionModel::SelectionFlags QAbstractItemView::selectionCommand(const QM
if (d->pressedAlreadySelected)
return QItemSelectionModel::NoUpdate;
break;
case QEvent::KeyPress:
case QEvent::MouseButtonRelease:
// clicking into area with no items does nothing
if (!index.isValid())
return QItemSelectionModel::NoUpdate;
Q_FALLTHROUGH();
case QEvent::KeyPress:
// ctrl-release on selected item deselects
if ((keyModifiers & Qt::ControlModifier) && d->selectionModel->isSelected(index))
return QItemSelectionModel::Deselect | d->selectionBehaviorFlags();

View File

@ -141,6 +141,7 @@ private slots:
void selectionCommand();
void mouseSelection_data();
void mouseSelection();
void keepSingleSelectionOnEmptyAreaClick();
void scrollerSmoothScroll();
void inputMethodOpensEditor_data();
void inputMethodOpensEditor();
@ -3077,6 +3078,37 @@ void tst_QAbstractItemView::mouseSelection()
QCOMPARE(actualSelected, selectedRows);
}
/*!
Make sure that when clicking on empty space in the view, we don't
unselect the current row.
QTBUG-105870
*/
void tst_QAbstractItemView::keepSingleSelectionOnEmptyAreaClick()
{
QListWidget view;
view.setSelectionMode(QAbstractItemView::SingleSelection);
QListWidgetItem *lastItem;
for (int i = 0; i < 5; i++)
lastItem = new QListWidgetItem("item " + QString::number(i), &view);
// Make widget large enough so that there is empty area below the last item
view.setFixedSize(300, 500);
view.show();
QVERIFY(QTest::qWaitForWindowActive(&view));
// Select third row
view.setCurrentRow(2);
// Click below the last row
QPoint targetPoint = view.visualItemRect(lastItem).bottomLeft();
targetPoint += QPoint(10, 10);
QTest::mouseClick(view.viewport(), Qt::MouseButton::LeftButton, Qt::NoModifier, targetPoint);
QCOMPARE(view.currentRow(), 2);
QVERIFY(view.currentItem()->isSelected());
}
/*!
Verify that scrolling an autoScroll enabled itemview with a QScroller
produces a continuous, smooth scroll without any jumping around due to