summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/opengl/qgl_p.h4
-rw-r--r--src/opengl/qgl_qpa.cpp9
-rw-r--r--src/widgets/kernel/qwidget_qpa.cpp4
3 files changed, 13 insertions, 4 deletions
diff --git a/src/opengl/qgl_p.h b/src/opengl/qgl_p.h
index 9a58beb3d7..ff9baf8971 100644
--- a/src/opengl/qgl_p.h
+++ b/src/opengl/qgl_p.h
@@ -132,6 +132,7 @@ class Q_OPENGL_EXPORT QGLWidgetPrivate : public QWidgetPrivate
public:
QGLWidgetPrivate() : QWidgetPrivate()
, disable_clear_on_painter_begin(false)
+ , parent_changing(false)
{
}
@@ -142,7 +143,7 @@ public:
bool renderCxPm(QPixmap *pixmap);
void cleanupColormaps();
void aboutToDestroy() {
- if (glcx)
+ if (glcx && !parent_changing)
glcx->reset();
}
@@ -153,6 +154,7 @@ public:
QGLColormap cmap;
bool disable_clear_on_painter_begin;
+ bool parent_changing;
};
// QGLContextPrivate has the responsibility of creating context groups.
diff --git a/src/opengl/qgl_qpa.cpp b/src/opengl/qgl_qpa.cpp
index f3388ee5ef..6e698bf939 100644
--- a/src/opengl/qgl_qpa.cpp
+++ b/src/opengl/qgl_qpa.cpp
@@ -362,6 +362,15 @@ void QGLWidgetPrivate::cleanupColormaps()
bool QGLWidget::event(QEvent *e)
{
+ Q_D(QGLWidget);
+
+ // A re-parent will destroy the window and re-create it. We should not reset the context while it happens.
+ if (e->type() == QEvent::ParentAboutToChange)
+ d->parent_changing = true;
+
+ if (e->type() == QEvent::ParentChange)
+ d->parent_changing = false;
+
return QWidget::event(e);
}
diff --git a/src/widgets/kernel/qwidget_qpa.cpp b/src/widgets/kernel/qwidget_qpa.cpp
index 590ebed5eb..3b6c9ca448 100644
--- a/src/widgets/kernel/qwidget_qpa.cpp
+++ b/src/widgets/kernel/qwidget_qpa.cpp
@@ -263,10 +263,8 @@ void QWidgetPrivate::setParent_sys(QWidget *newparent, Qt::WindowFlags f)
bool explicitlyHidden = q->testAttribute(Qt::WA_WState_Hidden) && q->testAttribute(Qt::WA_WState_ExplicitShowHide);
// Reparenting toplevel to child
- if (!(f&Qt::Window) && (oldFlags&Qt::Window) && !q->testAttribute(Qt::WA_NativeWindow)) {
- //qDebug() << "setParent_sys() change from toplevel";
+ if (wasCreated && !(f & Qt::Window) && (oldFlags & Qt::Window) && !q->testAttribute(Qt::WA_NativeWindow))
q->destroy();
- }
adjustFlags(f, q);
data.window_flags = f;