diff options
Diffstat (limited to 'src/widgets/kernel')
-rw-r--r-- | src/widgets/kernel/qapplication.cpp | 3 | ||||
-rw-r--r-- | src/widgets/kernel/qwidgetwindow.cpp | 6 |
2 files changed, 8 insertions, 1 deletions
diff --git a/src/widgets/kernel/qapplication.cpp b/src/widgets/kernel/qapplication.cpp index e93eaf5b30..27ffd1cc7c 100644 --- a/src/widgets/kernel/qapplication.cpp +++ b/src/widgets/kernel/qapplication.cpp @@ -3534,6 +3534,7 @@ static void grabForPopup(QWidget *popup) extern QWidget *qt_popup_down; extern bool qt_replay_popup_mouse_event; +extern bool qt_popup_down_closed; void QApplicationPrivate::closePopup(QWidget *popup) { @@ -3543,12 +3544,14 @@ void QApplicationPrivate::closePopup(QWidget *popup) if (popup == qt_popup_down) { qt_button_down = nullptr; + qt_popup_down_closed = true; qt_popup_down = nullptr; } if (QApplicationPrivate::popupWidgets->count() == 0) { // this was the last popup delete QApplicationPrivate::popupWidgets; QApplicationPrivate::popupWidgets = nullptr; + qt_popup_down_closed = false; if (popupGrabOk) { popupGrabOk = false; diff --git a/src/widgets/kernel/qwidgetwindow.cpp b/src/widgets/kernel/qwidgetwindow.cpp index 2faedccc20..51e785d0aa 100644 --- a/src/widgets/kernel/qwidgetwindow.cpp +++ b/src/widgets/kernel/qwidgetwindow.cpp @@ -62,6 +62,7 @@ Q_WIDGETS_EXPORT QWidget *qt_button_down = nullptr; // widget got last button-do // popup control QWidget *qt_popup_down = nullptr; // popup that contains the pressed widget extern int openPopupCount; +bool qt_popup_down_closed = false; // qt_popup_down has been closed bool qt_replay_popup_mouse_event = false; extern bool qt_try_modal(QWidget *widget, QEvent::Type type); @@ -526,6 +527,7 @@ void QWidgetWindow::handleMouseEvent(QMouseEvent *event) case QEvent::MouseButtonDblClick: qt_button_down = popupChild; qt_popup_down = activePopupWidget; + qt_popup_down_closed = false; break; case QEvent::MouseButtonRelease: releaseAfter = true; @@ -570,7 +572,7 @@ void QWidgetWindow::handleMouseEvent(QMouseEvent *event) if ((event->type() != QEvent::MouseButtonPress) || !(event->flags().testFlag(Qt::MouseEventCreatedDoubleClick))) { // if the widget that was pressed is gone, then deliver move events without buttons - const auto buttons = event->type() == QEvent::MouseMove && qt_button_down == nullptr + const auto buttons = event->type() == QEvent::MouseMove && qt_popup_down_closed ? Qt::NoButton : event->buttons(); QMouseEvent e(event->type(), widgetPos, event->scenePosition(), event->globalPosition(), event->button(), buttons, event->modifiers(), event->source()); @@ -643,11 +645,13 @@ void QWidgetWindow::handleMouseEvent(QMouseEvent *event) if (releaseAfter) { qt_button_down = nullptr; + qt_popup_down_closed = false; qt_popup_down = nullptr; } return; } + qt_popup_down_closed = false; // modal event handling if (QApplicationPrivate::instance()->modalState() && !qt_try_modal(m_widget, event->type())) return; |