From 41726a90e10b1705427dde8ad5a4181be6300309 Mon Sep 17 00:00:00 2001 From: Nodir Temirkhodjaev Date: Mon, 4 Apr 2022 13:43:51 +0300 Subject: QSplitter: Don't move handle in non-pressed state Fixes: QTBUG-102249 Change-Id: Ib1d74447e346760d1fc9960e11486e8dc7ea3bc0 Reviewed-by: Richard Moe Gustavsen (cherry picked from commit 99f22e3fc8caefcad810804da1a64446fb457337) Reviewed-by: Qt Cherry-pick Bot --- src/widgets/widgets/qsplitter.cpp | 23 ++++++++++++---------- .../widgets/widgets/qsplitter/tst_qsplitter.cpp | 21 ++++++++++++++++++++ 2 files changed, 34 insertions(+), 10 deletions(-) diff --git a/src/widgets/widgets/qsplitter.cpp b/src/widgets/widgets/qsplitter.cpp index 1c04f02422..bd5f31c662 100644 --- a/src/widgets/widgets/qsplitter.cpp +++ b/src/widgets/widgets/qsplitter.cpp @@ -289,10 +289,11 @@ bool QSplitterHandle::event(QEvent *event) void QSplitterHandle::mouseMoveEvent(QMouseEvent *e) { Q_D(QSplitterHandle); - if (!(e->buttons() & Qt::LeftButton)) + if (!d->pressed) return; - int pos = d->pick(parentWidget()->mapFromGlobal(e->globalPosition().toPoint())) - - d->mouseOffset; + + const int pos = d->pick(parentWidget()->mapFromGlobal(e->globalPosition().toPoint())) + - d->mouseOffset; if (opaqueResize()) { moveSplitter(pos); } else { @@ -319,16 +320,18 @@ void QSplitterHandle::mousePressEvent(QMouseEvent *e) void QSplitterHandle::mouseReleaseEvent(QMouseEvent *e) { Q_D(QSplitterHandle); - if (!opaqueResize() && e->button() == Qt::LeftButton) { - int pos = d->pick(parentWidget()->mapFromGlobal(e->globalPosition().toPoint())) - - d->mouseOffset; + if (!d->pressed) + return; + + if (!opaqueResize()) { + const int pos = d->pick(parentWidget()->mapFromGlobal(e->globalPosition().toPoint())) + - d->mouseOffset; d->s->setRubberBand(-1); moveSplitter(pos); } - if (e->button() == Qt::LeftButton) { - d->pressed = false; - update(); - } + + d->pressed = false; + update(); } /*! diff --git a/tests/auto/widgets/widgets/qsplitter/tst_qsplitter.cpp b/tests/auto/widgets/widgets/qsplitter/tst_qsplitter.cpp index ce7ac0a186..fef97f37b8 100644 --- a/tests/auto/widgets/widgets/qsplitter/tst_qsplitter.cpp +++ b/tests/auto/widgets/widgets/qsplitter/tst_qsplitter.cpp @@ -28,6 +28,8 @@ #include +#include + #include #include #include @@ -89,6 +91,7 @@ private slots: void task169702_sizes(); void taskQTBUG_4101_ensureOneNonCollapsedWidget_data(); void taskQTBUG_4101_ensureOneNonCollapsedWidget(); + void taskQTBUG_102249_moveNonPressed(); void setLayout(); void autoAdd(); @@ -1026,6 +1029,24 @@ void tst_QSplitter::taskQTBUG_4101_ensureOneNonCollapsedWidget() QTRY_VERIFY(s.sizes().at(0) > 0); } +void tst_QSplitter::taskQTBUG_102249_moveNonPressed() +{ + QSplitter s; + s.setOpaqueResize(true); + s.addWidget(new QWidget()); + s.addWidget(new QWidget()); + s.show(); + + QSignalSpy spyMove(&s, &QSplitter::splitterMoved); + QPointF posOutOfWidget = QPointF(30, 30); + QMouseEvent me(QEvent::MouseMove, + posOutOfWidget, s.mapToGlobal(posOutOfWidget), + Qt::NoButton, Qt::MouseButtons(Qt::LeftButton), + Qt::NoModifier); + qApp->sendEvent(s.handle(0), &me); + QCOMPARE(spyMove.count(), 0); +} + void tst_QSplitter::setLayout() { QSplitter splitter; -- cgit v1.2.3