diff options
-rw-r--r-- | src/widgets/widgets/qmenu.cpp | 4 | ||||
-rw-r--r-- | tests/auto/widgets/widgets/qmenu/tst_qmenu.cpp | 36 |
2 files changed, 38 insertions, 2 deletions
diff --git a/src/widgets/widgets/qmenu.cpp b/src/widgets/widgets/qmenu.cpp index dfa906d2ea..6b02e7371f 100644 --- a/src/widgets/widgets/qmenu.cpp +++ b/src/widgets/widgets/qmenu.cpp @@ -1967,8 +1967,8 @@ void QMenu::popup(const QPoint &p, QAction *atAction) pos.setX(mouse.x() - size.width()); #ifndef QT_NO_MENUBAR - // if in a menubar, it should be right-aligned - if (qobject_cast<QMenuBar*>(d->causedPopup.widget)) + // if the menu is in a menubar or is a submenu, it should be right-aligned + if (qobject_cast<QMenuBar*>(d->causedPopup.widget) || qobject_cast<QMenu*>(d->causedPopup.widget)) pos.rx() -= size.width(); #endif //QT_NO_MENUBAR diff --git a/tests/auto/widgets/widgets/qmenu/tst_qmenu.cpp b/tests/auto/widgets/widgets/qmenu/tst_qmenu.cpp index e48316fd19..9fdb8de4b8 100644 --- a/tests/auto/widgets/widgets/qmenu/tst_qmenu.cpp +++ b/tests/auto/widgets/widgets/qmenu/tst_qmenu.cpp @@ -101,6 +101,7 @@ private slots: void pushButtonPopulateOnAboutToShow(); void QTBUG7907_submenus_autoselect(); void QTBUG7411_submenus_activate(); + void QTBUG30595_rtl_submenu(); void QTBUG20403_nested_popup_on_shortcut_trigger(); void QTBUG_10735_crashWithDialog(); protected slots: @@ -896,6 +897,41 @@ void tst_QMenu::QTBUG7411_submenus_activate() QTRY_VERIFY(sub1.isVisible()); } +class LayoutDirectionSaver +{ + Q_DISABLE_COPY(LayoutDirectionSaver) +public: + explicit LayoutDirectionSaver(Qt::LayoutDirection direction) + : m_oldDirection(qApp->layoutDirection()) + { + qApp->setLayoutDirection(direction); + } + + ~LayoutDirectionSaver() + { + qApp->setLayoutDirection(m_oldDirection); + } + +private: + const Qt::LayoutDirection m_oldDirection; +}; + +void tst_QMenu::QTBUG30595_rtl_submenu() +{ + LayoutDirectionSaver directionSaver(Qt::RightToLeft); + QMenu menu("Test Menu"); + QMenu sub("&sub"); + sub.addAction("bar"); + sub.setTitle("&sub"); + menu.addMenu(&sub); + menu.move(200, 20); + menu.show(); + QVERIFY(QTest::qWaitForWindowExposed(&menu)); + QTest::mouseClick(&menu, Qt::LeftButton, Qt::NoModifier, QPoint(5,5) ); + QTRY_VERIFY(sub.isVisible()); + QVERIFY(sub.pos().x() < menu.pos().x()); +} + void tst_QMenu::QTBUG20403_nested_popup_on_shortcut_trigger() { QMenu menu("Test Menu"); |