macOS: Fix tst_MacGui::nonModalOrder()

The test is testing whether the order of creating a child window
of a modal dialog and showing the parent dialog matters. But to
allow child windows of a modal dialog to become active that child
also needs to be a dialog. That's a limitation on macOS, where
only NSPanel subclasses can override worksWhenModal.

Fix the test, and rewrite it using more modern idioms, avoiding
the need for long waits in the test.

Pick-to: 6.6 6.5
Change-Id: Ifb640d0288a3c7ed37f2c61294e34cd96fba49ca
Reviewed-by: Timur Pocheptsov <timur.pocheptsov@qt.io>
bb10
Tor Arne Vestbø 2023-10-25 11:29:35 +02:00
parent 7fb0c2bbf9
commit 1af821825a
2 changed files with 22 additions and 42 deletions

View File

@ -1,5 +1,2 @@
[nonModalOrder]
osx
[scrollbarPainting]
macos

View File

@ -126,40 +126,6 @@ void tst_MacGui::splashScreenModality()
QVERIFY(!QTestEventLoop::instance().timeout());
}
class PrimaryWindowDialog : public QDialog
{
Q_OBJECT
public:
PrimaryWindowDialog();
QWidget *secondaryWindow;
QWidget *frontWidget;
public slots:
void showSecondaryWindow();
void test();
};
PrimaryWindowDialog::PrimaryWindowDialog() : QDialog(0)
{
frontWidget = 0;
secondaryWindow = new ColorWidget(this);
secondaryWindow->setWindowFlags(Qt::Window);
secondaryWindow->resize(400, 400);
secondaryWindow->move(100, 100);
QTimer::singleShot(1000, this, SLOT(showSecondaryWindow()));
QTimer::singleShot(2000, this, SLOT(test()));
QTimer::singleShot(3000, this, SLOT(close()));
}
void PrimaryWindowDialog::showSecondaryWindow()
{
secondaryWindow->show();
}
void PrimaryWindowDialog::test()
{
frontWidget = QApplication::widgetAt(secondaryWindow->mapToGlobal(QPoint(100, 100)));
}
/*
Test that a non-modal child window of a modal dialog is shown in front
of the dialog even if the dialog becomes modal after the child window
@ -168,11 +134,28 @@ void PrimaryWindowDialog::test()
void tst_MacGui::nonModalOrder()
{
clearSequence();
PrimaryWindowDialog primary;
primary.resize(400, 400);
primary.move(100, 100);
primary.exec();
QCOMPARE(primary.frontWidget, primary.secondaryWindow);
QDialog dialog;
dialog.resize(400, 400);
dialog.move(100, 100);
ColorWidget child(&dialog);
// The child window needs to be a dialog, as only subclasses of NSPanel
// are allowed to override worksWhenModal, which is needed to mark the
// transient child as working within the modal session of the parent.
child.setWindowFlags(Qt::Window | Qt::Dialog);
child.resize(400, 400);
child.move(100, 100);
QTimer::singleShot(0, [&]{
QVERIFY(QTest::qWaitForWindowExposed(&dialog));
child.show();
QVERIFY(QTest::qWaitForWindowExposed(&child));
QCOMPARE(QApplication::widgetAt(child.mapToGlobal(QPoint(100, 100))), &child);
dialog.close();
});
dialog.exec();
}
/*