summaryrefslogtreecommitdiffstats
path: root/tests/auto/widgets/itemviews
diff options
context:
space:
mode:
authorChristian Ehrlicher <ch.ehrlicher@gmx.de>2021-04-21 21:29:19 +0200
committerVolker Hilsheimer <volker.hilsheimer@qt.io>2021-07-12 08:19:16 +0000
commite8b3d35a18e7e4cf6543868d89d6060c90314f39 (patch)
tree50f1cf00c959fe1b40111c5183bdbf950bf3fe22 /tests/auto/widgets/itemviews
parente71a5d5cc3c0337e7dbd5d571ecee5668baf8b63 (diff)
QTableView: fix selection with rows and cells in ExtendedSelection mode
QTableView stored the current row/column selection start in an own variable instead using currentSelectionStartIndex. This leads to an inconsistent behavior when the selection is done with a click on the header and then in a cell (and the other way round) Fixes: QTBUG-92561 Change-Id: I4c8bda3a938de451b6eff2819141e86a6870fbef Pick-to: 6.1 6.2 Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
Diffstat (limited to 'tests/auto/widgets/itemviews')
-rw-r--r--tests/auto/widgets/itemviews/qtableview/tst_qtableview.cpp72
1 files changed, 72 insertions, 0 deletions
diff --git a/tests/auto/widgets/itemviews/qtableview/tst_qtableview.cpp b/tests/auto/widgets/itemviews/qtableview/tst_qtableview.cpp
index 92bc30380a..662226de52 100644
--- a/tests/auto/widgets/itemviews/qtableview/tst_qtableview.cpp
+++ b/tests/auto/widgets/itemviews/qtableview/tst_qtableview.cpp
@@ -437,6 +437,8 @@ private slots:
void taskQTBUG_30653_doItemsLayout();
void taskQTBUG_50171_selectRowAfterSwapColumns();
void deselectRow();
+ void selectRowsAndCells();
+ void selectColumnsAndCells();
#if QT_CONFIG(wheelevent)
void mouseWheel_data();
@@ -4783,6 +4785,76 @@ void tst_QTableView::deselectRow()
QVERIFY(!tw.selectionModel()->isRowSelected(1, QModelIndex()));
}
+class QTableViewSelectCells : public QTableView
+{
+public:
+ QItemSelectionModel::SelectionFlags selectionCommand(const QModelIndex &index,
+ const QEvent *) const override
+ {
+ return QTableView::selectionCommand(index, shiftPressed ? &mouseEvent : nullptr);
+ }
+ QMouseEvent mouseEvent = QMouseEvent(QEvent::MouseButtonPress, QPointF(), Qt::LeftButton, Qt::LeftButton, Qt::ShiftModifier);
+ bool shiftPressed = false;
+};
+
+void tst_QTableView::selectRowsAndCells()
+{
+ const auto checkRows = [](const QModelIndexList &mil)
+ {
+ QCOMPARE(mil.size(), 3);
+ for (const auto &mi : mil)
+ QVERIFY(mi.row() >= 1 && mi.row() <= 3);
+ };
+ QTableViewSelectCells tw;
+ QtTestTableModel model(5, 1);
+ tw.setSelectionBehavior(QAbstractItemView::SelectRows);
+ tw.setSelectionMode(QAbstractItemView::ExtendedSelection);
+ tw.setModel(&model);
+ tw.show();
+
+ tw.selectRow(1);
+ tw.shiftPressed = true;
+ tw.selectRow(2);
+ tw.shiftPressed = false;
+ QTest::mouseClick(tw.viewport(), Qt::LeftButton, Qt::ShiftModifier, tw.visualRect(model.index(3, 0)).center());
+ checkRows(tw.selectionModel()->selectedRows());
+
+ tw.clearSelection();
+ QTest::mouseClick(tw.viewport(), Qt::LeftButton, Qt::NoModifier, tw.visualRect(model.index(3, 0)).center());
+ tw.shiftPressed = true;
+ tw.selectRow(1);
+ checkRows(tw.selectionModel()->selectedRows());
+}
+
+void tst_QTableView::selectColumnsAndCells()
+{
+ const auto checkColumns = [](const QModelIndexList &mil)
+ {
+ QCOMPARE(mil.size(), 3);
+ for (const auto &mi : mil)
+ QVERIFY(mi.column() >= 1 && mi.column() <= 3);
+ };
+ QTableViewSelectCells tw;
+ QtTestTableModel model(1, 5);
+ tw.setSelectionBehavior(QAbstractItemView::SelectColumns);
+ tw.setSelectionMode(QAbstractItemView::ExtendedSelection);
+ tw.setModel(&model);
+ tw.show();
+
+ tw.selectColumn(1);
+ tw.shiftPressed = true;
+ tw.selectColumn(2);
+ tw.shiftPressed = false;
+ QTest::mouseClick(tw.viewport(), Qt::LeftButton, Qt::ShiftModifier, tw.visualRect(model.index(0, 3)).center());
+ checkColumns(tw.selectionModel()->selectedColumns());
+
+ tw.clearSelection();
+ QTest::mouseClick(tw.viewport(), Qt::LeftButton, Qt::NoModifier, tw.visualRect(model.index(0, 3)).center());
+ tw.shiftPressed = true;
+ tw.selectColumn(1);
+ checkColumns(tw.selectionModel()->selectedColumns());
+}
+
// This has nothing to do with QTableView, but it's convenient to reuse the QtTestTableModel
#if QT_CONFIG(textmarkdownwriter)