diff options
author | Dongmei Wang <dongmei.wang@qt.io> | 2016-11-17 14:00:30 -0800 |
---|---|---|
committer | Gabriel de Dietrich <gabriel.dedietrich@qt.io> | 2017-04-14 17:06:12 +0000 |
commit | ae6ef2e3ec2174b2253fd04e1d69b949d3130067 (patch) | |
tree | 3155d95e4a3eebc93afc72d5597d7a43e9cbd4fc /tests/auto/widgets/widgets | |
parent | eea585ad0bfb92947ae2d77f3bc6662121cec9a9 (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')
-rw-r--r-- | tests/auto/widgets/widgets/qmenu/tst_qmenu.cpp | 37 |
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" |