Close all popup windows when the screen is rotated

Changing the screen orientation will cause the menu position to be
displayed incorrectly. When the screen is rotated, the geometry of
the application changes. We can refer to the handling of the menu
on Android or IOS. Close the popup window when the screen
orientation changes.

Fixes: QTBUG-95607
Pick-to: 6.2
Change-Id: I55e1cd6a8b89e375c6714a9163dfb1902d52f101
Reviewed-by: Richard Moe Gustavsen <richard.gustavsen@qt.io>
bb10
Tang Haixiang 2021-08-06 10:28:28 +08:00
parent d6661c5622
commit a7b1aaa98b
2 changed files with 18 additions and 0 deletions

View File

@ -2707,8 +2707,10 @@ bool QApplication::notify(QObject *receiver, QEvent *e)
switch (e->type()) {
case QEvent::ApplicationDeactivate:
case QEvent::OrientationChange:
// Close all popups (triggers when switching applications
// by pressing ALT-TAB on Windows, which is not receive as key event.
// triggers when the screen rotates.)
closeAllPopups();
break;
case QEvent::Wheel: // User input and window activation makes tooltips sleep

View File

@ -133,6 +133,7 @@ private slots:
void menuSize_Scrolling();
void tearOffMenuNotDisplayed();
void QTBUG_61039_menu_shortcuts();
void screenOrientationChangedCloseMenu();
protected slots:
void onActivated(QAction*);
@ -1960,5 +1961,20 @@ void tst_QMenu::QTBUG_61039_menu_shortcuts()
QTRY_COMPARE(actionJoeSpy.count(), 1);
}
void tst_QMenu::screenOrientationChangedCloseMenu()
{
QMenu menu;
menu.addAction("action1");
menu.show();
QTRY_COMPARE(menu.isVisible(),true);
Qt::ScreenOrientation orientation = menu.screen()->orientation() == Qt::PortraitOrientation ? Qt::LandscapeOrientation : Qt::PortraitOrientation;
QScreenOrientationChangeEvent event(menu.screen(), orientation);
QCoreApplication::sendEvent(QCoreApplication::instance(), &event);
QTRY_COMPARE(menu.isVisible(),false);
}
QTEST_MAIN(tst_QMenu)
#include "tst_qmenu.moc"