diff --git a/src/widgets/itemviews/qabstractitemview.cpp b/src/widgets/itemviews/qabstractitemview.cpp index 3fb77b72a6..dc507c24b1 100644 --- a/src/widgets/itemviews/qabstractitemview.cpp +++ b/src/widgets/itemviews/qabstractitemview.cpp @@ -1791,6 +1791,7 @@ bool QAbstractItemView::viewportEvent(QEvent *event) void QAbstractItemView::mousePressEvent(QMouseEvent *event) { Q_D(QAbstractItemView); + d->releaseFromDoubleClick = false; d->delayedAutoScroll.stop(); //any interaction with the view cancel the auto scrolling QPoint pos = event->position().toPoint(); QPersistentModelIndex index = indexAt(pos); diff --git a/tests/auto/widgets/itemviews/qabstractitemview/tst_qabstractitemview.cpp b/tests/auto/widgets/itemviews/qabstractitemview/tst_qabstractitemview.cpp index 547d120bca..5c52439859 100644 --- a/tests/auto/widgets/itemviews/qabstractitemview/tst_qabstractitemview.cpp +++ b/tests/auto/widgets/itemviews/qabstractitemview/tst_qabstractitemview.cpp @@ -49,6 +49,7 @@ #include #include #include +#include #include #include #include @@ -159,6 +160,7 @@ private slots: void dragSelectAfterNewPress(); void dragWithSecondClick_data(); void dragWithSecondClick(); + void clickAfterDoubleClick(); void selectionCommand_data(); void selectionCommand(); void mouseSelection_data(); @@ -2763,6 +2765,42 @@ void tst_QAbstractItemView::dragWithSecondClick() QTest::mouseRelease(view->viewport(), Qt::LeftButton, Qt::NoModifier, dragTo); } +void tst_QAbstractItemView::clickAfterDoubleClick() +{ + QTableWidget view(5, 5); + view.horizontalHeader()->hide(); + view.verticalHeader()->hide(); + view.setEditTriggers(QAbstractItemView::NoEditTriggers); + view.show(); + QVERIFY(QTest::qWaitForWindowExposed(&view)); + const QModelIndex index = view.model()->index(1, 1); + QVERIFY(index.isValid()); + const QPoint clickPoint = view.visualRect(index).center(); + + // must use the QWindow overloads so that modality is respected + QWindow *window = view.window()->windowHandle(); + int clickCount = 0; + + connect(&view, &QAbstractItemView::doubleClicked, [&]{ + QDialog dialog(&view); + dialog.setModal(true); + QTimer::singleShot(0, [&]{ dialog.close(); }); + dialog.exec(); + }); + connect(&view, &QAbstractItemView::clicked, [&]{ + ++clickCount; + }); + + QTest::mouseClick(window, Qt::LeftButton, {}, clickPoint); + QCOMPARE(clickCount, 1); + // generates a click followed by a double click; double click opens + // dialog that eats second release + QTest::mouseDClick(window, Qt::LeftButton, {}, clickPoint); + QCOMPARE(clickCount, 2); + QTest::mouseClick(window, Qt::LeftButton, {}, clickPoint); + QCOMPARE(clickCount, 3); +} + void tst_QAbstractItemView::selectionCommand_data() { QTest::addColumn("selectionMode");