diff --git a/src/corelib/kernel/qcoreevent.cpp b/src/corelib/kernel/qcoreevent.cpp index cce385352ef..62c76c1a409 100644 --- a/src/corelib/kernel/qcoreevent.cpp +++ b/src/corelib/kernel/qcoreevent.cpp @@ -274,6 +274,7 @@ QT_BEGIN_NAMESPACE \omitvalue NetworkReplyUpdated \omitvalue FutureCallOut \omitvalue NativeGesture + \omitvalue WindowChangeInternal */ /*! diff --git a/src/corelib/kernel/qcoreevent.h b/src/corelib/kernel/qcoreevent.h index e974c4d226a..3ee0eaaa61b 100644 --- a/src/corelib/kernel/qcoreevent.h +++ b/src/corelib/kernel/qcoreevent.h @@ -278,6 +278,8 @@ public: StyleAnimationUpdate = 213, // style animation target should be updated ApplicationStateChange = 214, + WindowChangeInternal = 215, // internal for QQuickWidget + // 512 reserved for Qt Jambi's MetaCall event // 513 reserved for Qt Jambi's DeleteOnMainThread event diff --git a/src/widgets/kernel/qwidget.cpp b/src/widgets/kernel/qwidget.cpp index e2c766ea4c1..102e659fbf3 100644 --- a/src/widgets/kernel/qwidget.cpp +++ b/src/widgets/kernel/qwidget.cpp @@ -9596,6 +9596,23 @@ void QWidget::setParent(QWidget *parent) setParent((QWidget*)parent, windowFlags() & ~Qt::WindowType_Mask); } +#ifndef QT_NO_OPENGL +static void sendWindowChangeToTextureChildrenRecursively(QWidget *widget) +{ + QWidgetPrivate *d = QWidgetPrivate::get(widget); + if (d->renderToTexture) { + QEvent e(QEvent::WindowChangeInternal); + QApplication::sendEvent(widget, &e); + } + + for (int i = 0; i < d->children.size(); ++i) { + QWidget *w = qobject_cast(d->children.at(i)); + if (w && !w->isWindow() && !w->isHidden() && QWidgetPrivate::get(w)->textureChildSeen) + sendWindowChangeToTextureChildrenRecursively(w); + } +} +#endif + /*! \overload @@ -9720,6 +9737,12 @@ void QWidget::setParent(QWidget *parent, Qt::WindowFlags f) QEvent e(QEvent::ParentChange); QApplication::sendEvent(this, &e); } +#ifndef QT_NO_OPENGL + //renderToTexture widgets also need to know when their top-level window changes + if (d->textureChildSeen && oldtlw != window()) { + sendWindowChangeToTextureChildrenRecursively(this); + } +#endif if (!wasCreated) { if (isWindow() || parentWidget()->isVisible())