Window change notification QQuickWidget

QQuickWidget and QOpenGLWidget needs to know when the window changes so
it can use the correct GL context.

Task-number: QTBUG-37045
Change-Id: Ib98b18e721908017398518f73226cb3731886927
Reviewed-by: Laszlo Agocs <laszlo.agocs@digia.com>
Reviewed-by: Jørgen Lind <jorgen.lind@digia.com>
This commit is contained in:
Paul Olav Tvete 2014-03-04 15:32:16 +01:00 committed by The Qt Project
parent 9ba7cc07db
commit cc278a4a78
3 changed files with 26 additions and 0 deletions

View File

@ -274,6 +274,7 @@ QT_BEGIN_NAMESPACE
\omitvalue NetworkReplyUpdated
\omitvalue FutureCallOut
\omitvalue NativeGesture
\omitvalue WindowChangeInternal
*/
/*!

View File

@ -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

View File

@ -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<QWidget *>(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())