summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/widgets/kernel/qwidgetwindow.cpp14
-rw-r--r--tests/auto/widgets/widgets/qmenu/tst_qmenu.cpp34
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;