diff --git a/src/gui/kernel/qwindow.cpp b/src/gui/kernel/qwindow.cpp index f2e44e886b7..f698113ed29 100644 --- a/src/gui/kernel/qwindow.cpp +++ b/src/gui/kernel/qwindow.cpp @@ -2083,16 +2083,6 @@ void QWindowPrivate::destroy() QObject *object = childrenWindows.at(i); if (object->isWindowType()) { QWindow *w = static_cast(object); - auto *childPlatformWindow = w->handle(); - if (!childPlatformWindow) - continue; - - // Decouple the foreign window from this window, - // so that destroying our native handle doesn't - // bring down the foreign window as well. - if (childPlatformWindow->isForeignWindow()) - childPlatformWindow->setParent(nullptr); - qt_window_private(w)->destroy(); } } diff --git a/src/plugins/platforms/windows/qwindowswindow.cpp b/src/plugins/platforms/windows/qwindowswindow.cpp index eb8cf6e9137..c7033a74c43 100644 --- a/src/plugins/platforms/windows/qwindowswindow.cpp +++ b/src/plugins/platforms/windows/qwindowswindow.cpp @@ -1364,6 +1364,12 @@ QWindowsForeignWindow::QWindowsForeignWindow(QWindow *window, HWND hwnd) setParent(QPlatformWindow::parent()); } +QWindowsForeignWindow::~QWindowsForeignWindow() +{ + if (QPlatformWindow::parent()) + setParent(nullptr); +} + void QWindowsForeignWindow::setParent(const QPlatformWindow *newParentWindow) { const bool wasTopLevel = isTopLevel_sys(); diff --git a/src/plugins/platforms/windows/qwindowswindow.h b/src/plugins/platforms/windows/qwindowswindow.h index f2e5c735920..687ade1d921 100644 --- a/src/plugins/platforms/windows/qwindowswindow.h +++ b/src/plugins/platforms/windows/qwindowswindow.h @@ -160,6 +160,7 @@ class QWindowsForeignWindow : public QWindowsBaseWindow { public: explicit QWindowsForeignWindow(QWindow *window, HWND hwnd); + ~QWindowsForeignWindow(); void setParent(const QPlatformWindow *window) override; void setGeometry(const QRect &rect) override { setGeometry_sys(rect); } diff --git a/src/plugins/platforms/xcb/qxcbwindow.cpp b/src/plugins/platforms/xcb/qxcbwindow.cpp index 7fd6fc0c4e3..5caf4b21acf 100644 --- a/src/plugins/platforms/xcb/qxcbwindow.cpp +++ b/src/plugins/platforms/xcb/qxcbwindow.cpp @@ -530,6 +530,9 @@ QXcbForeignWindow::QXcbForeignWindow(QWindow *window, WId nativeHandle) QXcbForeignWindow::~QXcbForeignWindow() { + if (QPlatformWindow::parent()) + setParent(nullptr); + // Clear window so that destroy() does not affect it m_window = 0;