diff --git a/src/declarativeimports/plasmacomponents/qmenu.h b/src/declarativeimports/plasmacomponents/qmenu.h --- a/src/declarativeimports/plasmacomponents/qmenu.h +++ b/src/declarativeimports/plasmacomponents/qmenu.h @@ -184,6 +184,7 @@ private: void rebuildMenu(); void openInternal(QPoint pos); + QQuickItem *parentItem() const; QList m_items; QMenu *m_menu; diff --git a/src/declarativeimports/plasmacomponents/qmenu.cpp b/src/declarativeimports/plasmacomponents/qmenu.cpp --- a/src/declarativeimports/plasmacomponents/qmenu.cpp +++ b/src/declarativeimports/plasmacomponents/qmenu.cpp @@ -24,6 +24,8 @@ #include #include #include +#include +#include #include @@ -424,25 +426,45 @@ void QMenuProxy::openInternal(QPoint pos) { - QQuickItem *parentItem = nullptr; - - if (m_visualParent) { - parentItem = qobject_cast(m_visualParent.data()); - } else { - parentItem = qobject_cast(parent()); - } + QQuickItem *parentItem = this->parentItem(); if (parentItem && parentItem->window()) { //create the QWindow m_menu->winId(); m_menu->windowHandle()->setTransientParent(parentItem->window()); + + // Workaround for QTBUG-59044 + auto ungrabMouseHack = [this]() { + QQuickItem *parentItem = this->parentItem(); + if (parentItem && parentItem->window() && parentItem->window()->mouseGrabberItem()) { + parentItem->window()->mouseGrabberItem()->ungrabMouse(); + } + }; + + //pre 5.8.0 QQuickWindow code is "item->grabMouse(); sendEvent(item, mouseEvent)" + //post 5.8.0 QQuickWindow code is sendEvent(item, mouseEvent); item->grabMouse() + if (QVersionNumber::fromString(qVersion()) > QVersionNumber(5, 8, 0)) { + QTimer::singleShot(0, this, ungrabMouseHack); + } else { + ungrabMouseHack(); + } + //end workaround } m_menu->popup(pos); m_status = DialogStatus::Open; emit statusChanged(); } +QQuickItem *QMenuProxy::parentItem() const +{ + if (m_visualParent) { + return qobject_cast(m_visualParent.data()); + } + + return qobject_cast(parent()); +} + void QMenuProxy::close() { m_menu->hide();