summaryrefslogtreecommitdiffstats
path: root/tests/auto/widgets/widgets/qmenu/tst_qmenu.cpp
diff options
context:
space:
mode:
authorDongmei Wang <dongmei.wang@qt.io>2016-11-17 14:00:30 -0800
committerGabriel de Dietrich <gabriel.dedietrich@qt.io>2017-04-14 17:06:12 +0000
commitae6ef2e3ec2174b2253fd04e1d69b949d3130067 (patch)
tree3155d95e4a3eebc93afc72d5597d7a43e9cbd4fc /tests/auto/widgets/widgets/qmenu/tst_qmenu.cpp
parenteea585ad0bfb92947ae2d77f3bc6662121cec9a9 (diff)
QMenu: Fix torn-off menu display crash issue
When tearing off either a non-scrollable multi-colume menu or a scrollable menu, displaying the torn-off menu crashes. The root cause is when the torn-off menu is created, the tear-off menu's style, margins and other attributes are not set to it. The patch is to ensure the torn-off menu has the same attributes as the tear-off menu does and set the torn-off menu with a correct menu size. Task-number: QTBUG-24815 Change-Id: Icea45f149ea8792671af4a62e62cad6ee01a1f95 Reviewed-by: Gabriel de Dietrich <gabriel.dedietrich@qt.io>
Diffstat (limited to 'tests/auto/widgets/widgets/qmenu/tst_qmenu.cpp')
-rw-r--r--tests/auto/widgets/widgets/qmenu/tst_qmenu.cpp37
1 files changed, 37 insertions, 0 deletions
diff --git a/tests/auto/widgets/widgets/qmenu/tst_qmenu.cpp b/tests/auto/widgets/widgets/qmenu/tst_qmenu.cpp
index 9109b2e8a3..e5e2e157c5 100644
--- a/tests/auto/widgets/widgets/qmenu/tst_qmenu.cpp
+++ b/tests/auto/widgets/widgets/qmenu/tst_qmenu.cpp
@@ -130,6 +130,8 @@ private slots:
void QTBUG_56917_wideSubmenuScreenNumber();
void menuSize_Scrolling_data();
void menuSize_Scrolling();
+ void tearOffMenuNotDisplayed();
+
protected slots:
void onActivated(QAction*);
void onHighlighted(QAction*);
@@ -1556,5 +1558,40 @@ void tst_QMenu::menuSize_Scrolling()
menu.height() - mm.fw - mm.vmargin - bottomMargin - 1);
}
+void tst_QMenu::tearOffMenuNotDisplayed()
+{
+ QWidget widget;
+ QScopedPointer<QMenu> menu(new QMenu(&widget));
+ menu->setTearOffEnabled(true);
+ QVERIFY(menu->isTearOffEnabled());
+
+ menu->setStyleSheet("QMenu { menu-scrollable: 1 }");
+ for (int i = 0; i < 80; i++)
+ menu->addAction(QString::number(i));
+
+ widget.resize(300, 200);
+ centerOnScreen(&widget);
+ widget.show();
+ widget.activateWindow();
+ QVERIFY(QTest::qWaitForWindowActive(&widget));
+ menu->popup(widget.geometry().topRight() + QPoint(50, 0));
+ QVERIFY(QTest::qWaitForWindowActive(menu.data()));
+ QVERIFY(!menu->isTearOffMenuVisible());
+
+ MenuMetrics mm(menu.data());
+ const int tearOffOffset = mm.fw + mm.vmargin + mm.tearOffHeight / 2;
+
+ QTest::mouseClick(menu.data(), Qt::LeftButton, 0, QPoint(10, tearOffOffset), 10);
+ QTRY_VERIFY(menu->isTearOffMenuVisible());
+ QPointer<QMenu> torn = getTornOffMenu();
+ QVERIFY(torn);
+ QVERIFY(torn->isVisible());
+ QVERIFY(torn->minimumWidth() >=0 && torn->minimumWidth() < QWIDGETSIZE_MAX);
+
+ menu->hideTearOffMenu();
+ QVERIFY(!menu->isTearOffMenuVisible());
+ QVERIFY(!torn->isVisible());
+}
+
QTEST_MAIN(tst_QMenu)
#include "tst_qmenu.moc"