QAbstractItemView: Don't unselect on click on empty area in SingleSelect
dfb4697e4a4828acd47292a89207b3975ec6766e 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 Change-Id: I191c3878819b99897083039fba0ab43908da5429 Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io> (cherry picked from commit f11e5435c776deddf27f7759180c1d41f64b8cce) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
This commit is contained in:
parent
e36aa1a225
commit
2e898a6a52
@ -4093,8 +4093,12 @@ QItemSelectionModel::SelectionFlags QAbstractItemView::selectionCommand(const QM
|
|||||||
if (d->pressedAlreadySelected)
|
if (d->pressedAlreadySelected)
|
||||||
return QItemSelectionModel::NoUpdate;
|
return QItemSelectionModel::NoUpdate;
|
||||||
break;
|
break;
|
||||||
case QEvent::KeyPress:
|
|
||||||
case QEvent::MouseButtonRelease:
|
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
|
// ctrl-release on selected item deselects
|
||||||
if ((keyModifiers & Qt::ControlModifier) && d->selectionModel->isSelected(index))
|
if ((keyModifiers & Qt::ControlModifier) && d->selectionModel->isSelected(index))
|
||||||
return QItemSelectionModel::Deselect | d->selectionBehaviorFlags();
|
return QItemSelectionModel::Deselect | d->selectionBehaviorFlags();
|
||||||
|
@ -141,6 +141,7 @@ private slots:
|
|||||||
void selectionCommand();
|
void selectionCommand();
|
||||||
void mouseSelection_data();
|
void mouseSelection_data();
|
||||||
void mouseSelection();
|
void mouseSelection();
|
||||||
|
void keepSingleSelectionOnEmptyAreaClick();
|
||||||
void scrollerSmoothScroll();
|
void scrollerSmoothScroll();
|
||||||
void inputMethodOpensEditor_data();
|
void inputMethodOpensEditor_data();
|
||||||
void inputMethodOpensEditor();
|
void inputMethodOpensEditor();
|
||||||
@ -3077,6 +3078,37 @@ void tst_QAbstractItemView::mouseSelection()
|
|||||||
QCOMPARE(actualSelected, selectedRows);
|
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
|
Verify that scrolling an autoScroll enabled itemview with a QScroller
|
||||||
produces a continuous, smooth scroll without any jumping around due to
|
produces a continuous, smooth scroll without any jumping around due to
|
||||||
|
Loading…
x
Reference in New Issue
Block a user