diff --git a/src/Platform.h b/src/Platform.h index 1c7f113d..9a0688ec 100644 --- a/src/Platform.h +++ b/src/Platform.h @@ -55,6 +55,9 @@ public: /// @brief Creates and returns the default FrameworkWidgetFactory virtual FrameworkWidgetFactory *createDefaultFrameworkWidgetFactory() = 0; + /// @brief Returns the window at the specified global coordinates + virtual std::shared_ptr windowAt(QPoint globalPos) const = 0; + #ifdef DOCKS_DEVELOPER_MODE /// @brief Waits for the specified window to be active (have the keyboard focus) /// Window::isActive() should return true diff --git a/src/qtquick/Platform_qtquick.h b/src/qtquick/Platform_qtquick.h index 642e6362..fedbaa88 100644 --- a/src/qtquick/Platform_qtquick.h +++ b/src/qtquick/Platform_qtquick.h @@ -26,6 +26,7 @@ public: std::shared_ptr qobjectAsView(QObject *) const override; std::shared_ptr windowFromQWindow(QWindow *) const override; FrameworkWidgetFactory *createDefaultFrameworkWidgetFactory() override; + Window::Ptr windowAt(QPoint globalPos) const override; }; } diff --git a/src/qtwidgets/Platform_qtwidgets.cpp b/src/qtwidgets/Platform_qtwidgets.cpp index b0e17461..feb16854 100644 --- a/src/qtwidgets/Platform_qtwidgets.cpp +++ b/src/qtwidgets/Platform_qtwidgets.cpp @@ -72,3 +72,13 @@ FrameworkWidgetFactory *Platform_qtwidgets::createDefaultFrameworkWidgetFactory( { return new DefaultWidgetFactory_qtwidgets(); } + +Window::Ptr Platform_qtwidgets::windowAt(QPoint globalPos) const +{ + if (auto qwindow = qApp->QGuiApplication::topLevelAt(globalPos)) { + auto window = new Window_qtwidgets(qwindow); + return Window::Ptr(window); + } + + return {}; +} diff --git a/src/qtwidgets/Platform_qtwidgets.h b/src/qtwidgets/Platform_qtwidgets.h index e5d4de58..d665c235 100644 --- a/src/qtwidgets/Platform_qtwidgets.h +++ b/src/qtwidgets/Platform_qtwidgets.h @@ -28,6 +28,7 @@ public: std::shared_ptr qobjectAsView(QObject *) const override; std::shared_ptr windowFromQWindow(QWindow *) const override; FrameworkWidgetFactory *createDefaultFrameworkWidgetFactory() override; + std::shared_ptr windowAt(QPoint globalPos) const override; }; } diff --git a/tests/tst_docks.cpp b/tests/tst_docks.cpp index 8188aae2..31a6b052 100644 --- a/tests/tst_docks.cpp +++ b/tests/tst_docks.cpp @@ -6314,7 +6314,7 @@ void TestDocks::tst_raise() dock3->raise(); QTest::qWait(200); - if (qApp->QGuiApplication::topLevelAt(dock3->window()->geometry().topLeft() + QPoint(50, 50)) != dock3->view()->asQWidget()->windowHandle()) { + if (!Platform::instance()->windowAt(dock3->window()->geometry().topLeft() + QPoint(50, 50))->equals(dock3->view()->windowHandle())) { qDebug() << "Failing before raise" << qApp->widgetAt(dock3->window()->geometry().topLeft() + QPoint(50, 50))->window() << dock3->window().get() << dock1->window()->geometry() << dock3->window()->geometry(); QVERIFY(false); @@ -6324,7 +6324,7 @@ void TestDocks::tst_raise() QTest::qWait(200); QVERIFY(dock1->isCurrentTab()); - if (qApp->QGuiApplication::topLevelAt(dock3->window()->geometry().topLeft() + QPoint(50, 50)) != dock1->view()->asQWidget()->windowHandle()) { + if (Platform::instance()->windowAt(dock3->window()->geometry().topLeft() + QPoint(50, 50))->equals(dock1->view()->windowHandle())) { qDebug() << "Failing after raise" << qApp->widgetAt(dock3->window()->geometry().topLeft() + QPoint(50, 50))->window() << dock1->window().get() << dock1->window()->geometry() << dock3->window()->geometry(); QVERIFY(false);