From 239f67f158c55d3eb88348a53b87fa272402c733 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Mon, 19 Jan 2015 16:57:20 +0100 Subject: Do not close popup widgets when showing a widget embedded into QGraphicsView. Disable top-level widget code path for embedded widget in the show helper. Task-number: QTBUG-43780 Change-Id: I574e07130e5e68a019a426cee3fde982f3883720 Reviewed-by: Shawn Rutledge --- .../tst_qgraphicsproxywidget.cpp | 39 ++++++++++++++++++++++ 1 file changed, 39 insertions(+) (limited to 'tests/auto/widgets/graphicsview/qgraphicsproxywidget/tst_qgraphicsproxywidget.cpp') diff --git a/tests/auto/widgets/graphicsview/qgraphicsproxywidget/tst_qgraphicsproxywidget.cpp b/tests/auto/widgets/graphicsview/qgraphicsproxywidget/tst_qgraphicsproxywidget.cpp index 66d0f64ceb..5aea845f90 100644 --- a/tests/auto/widgets/graphicsview/qgraphicsproxywidget/tst_qgraphicsproxywidget.cpp +++ b/tests/auto/widgets/graphicsview/qgraphicsproxywidget/tst_qgraphicsproxywidget.cpp @@ -175,6 +175,7 @@ private slots: void windowFrameMargins(); void QTBUG_6986_sendMouseEventToAlienWidget(); void mapToGlobal(); + void QTBUG_43780_visibility(); }; // Subclass that exposes the protected functions. @@ -278,6 +279,8 @@ void tst_QGraphicsProxyWidget::initTestCase() // Disable menu animations to prevent the alpha widget from getting in the way // in actionsContextMenu(). QApplication::setEffectEnabled(Qt::UI_AnimateMenu, false); + // Disable combo for QTBUG_43780_visibility()/Windows Vista. + QApplication::setEffectEnabled(Qt::UI_AnimateCombo, false); } // This will be called after the last test function is executed. @@ -3687,5 +3690,41 @@ void tst_QGraphicsProxyWidget::mapToGlobal() // QTBUG-41135 .arg(embeddedCenterGlobal.x()).arg(embeddedCenterGlobal.y()))); } +// QTBUG_43780: Embedded widgets have isWindow()==true but showing them should not +// trigger the top-level widget code path of show() that closes all popups +// (for example combo popups). +void tst_QGraphicsProxyWidget::QTBUG_43780_visibility() +{ + const QRect availableGeometry = QGuiApplication::primaryScreen()->availableGeometry(); + const QSize size = availableGeometry.size() / 4; + QWidget mainWindow; + QVBoxLayout *layout = new QVBoxLayout(&mainWindow); + QComboBox *combo = new QComboBox(&mainWindow); + combo->addItems(QStringList() << "i1" << "i2" << "i3"); + layout->addWidget(combo); + QGraphicsScene *scene = new QGraphicsScene(&mainWindow); + QGraphicsView *view = new QGraphicsView(scene, &mainWindow); + layout->addWidget(view); + mainWindow.setWindowTitle(QTest::currentTestFunction()); + mainWindow.resize(size); + mainWindow.move(availableGeometry.topLeft() + + QPoint(availableGeometry.width() - size.width(), + availableGeometry.height() - size.height()) / 2); + QLabel *label = new QLabel(QTest::currentTestFunction()); + scene->addWidget(label); + label->hide(); + mainWindow.show(); + combo->setFocus(); + mainWindow.activateWindow(); + QVERIFY(QTest::qWaitForWindowActive(&mainWindow)); + combo->showPopup(); + QWidget *comboPopup = combo->view()->window(); + QVERIFY(comboPopup); + QVERIFY(QTest::qWaitForWindowExposed(comboPopup)); + label->show(); + QTRY_VERIFY(label->isVisible()); + QVERIFY(comboPopup->isVisible()); +} + QTEST_MAIN(tst_QGraphicsProxyWidget) #include "tst_qgraphicsproxywidget.moc" -- cgit v1.2.3