diff options
-rw-r--r-- | src/widgets/kernel/qwidgetwindow.cpp | 14 | ||||
-rw-r--r-- | tests/auto/widgets/widgets/qmenu/tst_qmenu.cpp | 34 |
2 files changed, 48 insertions, 0 deletions
diff --git a/src/widgets/kernel/qwidgetwindow.cpp b/src/widgets/kernel/qwidgetwindow.cpp index 4cf2934a2dc..b85446121bd 100644 --- a/src/widgets/kernel/qwidgetwindow.cpp +++ b/src/widgets/kernel/qwidgetwindow.cpp @@ -622,7 +622,21 @@ void QWidgetWindow::handleMouseEvent(QMouseEvent *event) } } QApplicationPrivate::replayMousePress = false; +#ifndef QT_NO_CONTEXTMENU + } else if (event->type() == QGuiApplicationPrivate::contextMenuEventType() + && event->button() == Qt::RightButton) { + QWidget *receiver = activePopupWidget; + if (qt_button_down) + receiver = qt_button_down; + else if (popupChild) + receiver = popupChild; + const QPoint localPos = receiver->mapFromGlobal(event->globalPosition().toPoint()); + QContextMenuEvent e(QContextMenuEvent::Mouse, localPos, event->globalPosition().toPoint(), event->modifiers()); + QApplication::forwardEvent(receiver, &e, event); + } +#else } +#endif if (releaseAfter) { qt_button_down = nullptr; diff --git a/tests/auto/widgets/widgets/qmenu/tst_qmenu.cpp b/tests/auto/widgets/widgets/qmenu/tst_qmenu.cpp index 1b3afa0a4dc..cbe554f997f 100644 --- a/tests/auto/widgets/widgets/qmenu/tst_qmenu.cpp +++ b/tests/auto/widgets/widgets/qmenu/tst_qmenu.cpp @@ -8,10 +8,12 @@ #include <QPushButton> #include <QMainWindow> #include <QMenuBar> +#include <QPlainTextEdit> #include <QToolBar> #include <QToolButton> #include <QStatusBar> #include <QListWidget> +#include <QVBoxLayout> #include <QWidgetAction> #include <QScreen> #include <QSpinBox> @@ -96,6 +98,8 @@ private slots: void QTBUG_89082_actionTipsHide(); void QTBUG8122_widgetActionCrashOnClose(); void widgetActionTriggerClosesMenu(); + void widgetActionContextMenu(); + void transientParent(); void QTBUG_10735_crashWithDialog(); @@ -1590,6 +1594,36 @@ void tst_QMenu::widgetActionTriggerClosesMenu() QCOMPARE(actionTriggered, &widgetAction); } +void tst_QMenu::widgetActionContextMenu() // QTBUG-134757 +{ + QPushButton openButton("open"); + QMenu *menu = new QMenu(&openButton); + QVBoxLayout *layout = new QVBoxLayout; + QWidgetAction widgetAction(menu); + QWidget menuWidget(menu); + QPlainTextEdit edit; + openButton.setMenu(menu); + menuWidget.setLayout(layout); + widgetAction.setDefaultWidget(&menuWidget); + menu->addAction(&widgetAction); + layout->addWidget(&edit); + + openButton.show(); + QVERIFY(QTest::qWaitForWindowExposed(&openButton)); + + // Click the QPushButton to open its menu + QTest::mouseClick(&openButton, Qt::LeftButton); + QVERIFY(QTest::qWaitForWindowExposed(&menuWidget)); + QWindow *popupWindow = edit.window()->windowHandle(); + QVERIFY(popupWindow); + QCOMPARE(QApplication::activePopupWidget(), menu); + + // Right-click the QPlainTextEdit to open its context menu + QTest::mouseClick(popupWindow, Qt::RightButton); + QVERIFY(qobject_cast<QMenu *>(QApplication::activePopupWidget())); + QCOMPARE_NE(QApplication::activePopupWidget(), menu); +} + void tst_QMenu::transientParent() { QMainWindow window; |