diff -rupN qt-everywhere-opensource-src-5.0.0-beta1.orig/qt3d/src/threed/viewing/qglview.cpp qt-everywhere-opensource-src-5.0.0-beta1/qt3d/src/threed/viewing/qglview.cpp --- qt-everywhere-opensource-src-5.0.0-beta1.orig/qt3d/src/threed/viewing/qglview.cpp 2012-08-28 21:41:54.000000000 +0200 +++ qt-everywhere-opensource-src-5.0.0-beta1/qt3d/src/threed/viewing/qglview.cpp 2012-10-28 15:53:36.000000000 +0100 @@ -263,6 +263,8 @@ public: delete fbo; delete leftSurface; delete rightSurface; + if(context) + delete context; } QGLView *view; @@ -337,6 +339,11 @@ inline void QGLViewPrivate::ensureContex { if (!context) { + view->setSurfaceType(QWindow::OpenGLSurface); + view->setFormat(format); + if (!view->parent()) + processStereoOptions(view); + context = new QOpenGLContext(); context->setFormat(format); #ifndef QT_NO_DEBUG_STREAM @@ -600,6 +607,9 @@ QGLView::QGLView(QWindow *parent) // setMouseTracking(true); if (!parent) d->processStereoOptions(this); + + connect((QWindow*)this,SIGNAL(aboutToBeDestroyed()),this,SLOT(preDestroyContext()),Qt::DirectConnection); + connect((QWindow*)this,SIGNAL(destroyed()),this,SLOT(destroyContext()),Qt::DirectConnection); } /*! @@ -624,6 +634,9 @@ QGLView::QGLView(const QSurfaceFormat& f // setMouseTracking(true); if (!parent) d->processStereoOptions(this); + + connect((QWindow*)this,SIGNAL(aboutToBeDestroyed()),this,SLOT(preDestroyContext()),Qt::DirectConnection); + connect((QWindow*)this,SIGNAL(destroyed()),this,SLOT(destroyContext()),Qt::DirectConnection); } /*! @@ -634,6 +647,27 @@ QGLView::~QGLView() delete d; } +void QGLView::preDestroyContext() +{ + qDebug("QGLView::preDestroyContext"); + if(d && d->context) + d->context->doneCurrent(); +} + +void QGLView::destroyContext() +{ + qDebug("QGLView::destroyContext"); + if(d && d->context) + { + if(isVisible()) + setVisible(false); + QSurfaceFormat l_format = d->format; + delete d; + d = new QGLViewPrivate(this); + d->format = l_format; + } +} + /*! Returns the options for this view. The default value is CameraNavigation. @@ -836,6 +870,8 @@ void QGLView::exposeEvent(QExposeEvent * { Q_UNUSED(e); + if(!surfaceHandle()) return; + d->updateQueued = false; d->ensureContext(); if (!d->initialized) @@ -849,15 +885,21 @@ void QGLView::exposeEvent(QExposeEvent * void QGLView::resizeEvent(QResizeEvent *e) { Q_UNUSED(e); + + if(!surfaceHandle()) return; + QRect r = geometry(); Q_ASSERT(e->size() == r.size()); if (r.size() != d->viewport.size()) { - d->ensureContext(); - if (!d->initialized) - initializeGL(); - resizeGL(r.width(), r.height()); - d->viewport = r; + if(isVisible()) + { + d->ensureContext(); + if (!d->initialized) + initializeGL(); + resizeGL(r.width(), r.height()); + d->viewport = r; + } } } diff -rupN qt-everywhere-opensource-src-5.0.0-beta1.orig/qt3d/src/threed/viewing/qglview.h qt-everywhere-opensource-src-5.0.0-beta1/qt3d/src/threed/viewing/qglview.h --- qt-everywhere-opensource-src-5.0.0-beta1.orig/qt3d/src/threed/viewing/qglview.h 2012-08-28 21:41:54.000000000 +0200 +++ qt-everywhere-opensource-src-5.0.0-beta1/qt3d/src/threed/viewing/qglview.h 2012-10-28 15:53:36.000000000 +0100 @@ -111,6 +111,10 @@ Q_SIGNALS: public Q_SLOTS: void update(); +protected Q_SLOTS: + void preDestroyContext(); + void destroyContext(); + protected: void initializeGL(); void resizeGL(int w, int h); diff -rupN qt-everywhere-opensource-src-5.0.0-beta1.orig/qtbase/src/gui/kernel/qwindow.cpp qt-everywhere-opensource-src-5.0.0-beta1/qtbase/src/gui/kernel/qwindow.cpp --- qt-everywhere-opensource-src-5.0.0-beta1.orig/qtbase/src/gui/kernel/qwindow.cpp 2012-08-28 21:40:53.000000000 +0200 +++ qt-everywhere-opensource-src-5.0.0-beta1/qtbase/src/gui/kernel/qwindow.cpp 2012-10-28 15:52:58.000000000 +0100 @@ -1146,6 +1146,9 @@ void QWindow::resize(const QSize &newSiz void QWindow::destroy() { Q_D(QWindow); + + emit aboutToBeDestroyed(); + QObjectList childrenWindows = children(); for (int i = 0; i < childrenWindows.size(); i++) { QObject *object = childrenWindows.at(i); @@ -1156,11 +1159,16 @@ void QWindow::destroy() } } setVisible(false); + delete d->platformWindow; + d->resizeEventPending = true; d->receivedExpose = false; d->exposed = false; d->platformWindow = 0; + + emit destroyed(); + } /*! diff -rupN qt-everywhere-opensource-src-5.0.0-beta1.orig/qtbase/src/gui/kernel/qwindow.h qt-everywhere-opensource-src-5.0.0-beta1/qtbase/src/gui/kernel/qwindow.h --- qt-everywhere-opensource-src-5.0.0-beta1.orig/qtbase/src/gui/kernel/qwindow.h 2012-08-28 21:40:53.000000000 +0200 +++ qt-everywhere-opensource-src-5.0.0-beta1/qtbase/src/gui/kernel/qwindow.h 2012-10-28 15:52:58.000000000 +0100 @@ -284,6 +284,10 @@ Q_SIGNALS: void focusObjectChanged(QObject *object); + void destroyed(); + void aboutToBeDestroyed(); + + private Q_SLOTS: void screenDestroyed(QObject *screen); @@ -315,9 +319,8 @@ protected: QWindow(QWindowPrivate &dd, QWindow *parent); -private: QPlatformSurface *surfaceHandle() const; - +private: Q_DISABLE_COPY(QWindow) friend class QGuiApplication;