From 3e09f3abbb03e315c1c6d78941f1c20bb0782468 Mon Sep 17 00:00:00 2001 From: Laszlo Agocs Date: Thu, 3 Aug 2023 12:00:39 +0200 Subject: [PATCH] Fix texture-based non-native child of a non-texture-based native child Another one in the series of problems around having texture-based and regular widgets in hierarchies where some widgets are native and some are not. Fixes: QTBUG-115652 Task-number: QTBUG-108344 Task-number: QTBUG-113557 Change-Id: I34306503cb17ccb915b90168ec3f39e209f668e5 Reviewed-by: Andy Nichols (cherry picked from commit 373c08d03d39b6933a16a5b839aa7ae271cede42) Reviewed-by: Laszlo Agocs Reviewed-by: Qt CI Bot --- src/widgets/kernel/qwidget.cpp | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/widgets/kernel/qwidget.cpp b/src/widgets/kernel/qwidget.cpp index c373e7c6f27..1e4ee60e599 100644 --- a/src/widgets/kernel/qwidget.cpp +++ b/src/widgets/kernel/qwidget.cpp @@ -10865,11 +10865,19 @@ void QWidget::setParent(QWidget *parent, Qt::WindowFlags f) // problematic when it comes to large widget trees. if (q_evaluateRhiConfig(this, nullptr, &surfaceType)) { newtlw->d_func()->usesRhiFlush = true; + bool recreate = false; if (QWindow *w = newtlw->windowHandle()) { - if (w->surfaceType() != surfaceType) { - newtlw->destroy(); - newtlw->create(); - } + if (w->surfaceType() != surfaceType) + recreate = true; + } + // QTBUG-115652: Besides the toplevel the nativeParentWidget()'s QWindow must be checked as well. + if (QWindow *w = d->windowHandle(QWidgetPrivate::WindowHandleMode::Closest)) { + if (w->surfaceType() != surfaceType) + recreate = true; + } + if (recreate) { + newtlw->destroy(); + newtlw->create(); } } }