aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/quick/items/qquickrendercontrol.cpp20
-rw-r--r--src/quick/items/qquickrendercontrol_p.h1
-rw-r--r--src/quickwidgets/qquickwidget.cpp17
3 files changed, 34 insertions, 4 deletions
diff --git a/src/quick/items/qquickrendercontrol.cpp b/src/quick/items/qquickrendercontrol.cpp
index faee1358ae..16ed6f0e10 100644
--- a/src/quick/items/qquickrendercontrol.cpp
+++ b/src/quick/items/qquickrendercontrol.cpp
@@ -162,6 +162,26 @@ bool QQuickRenderControl::sync()
}
/*!
+ Stop rendering and release resources. This function is typically
+ called when the window is hidden. Requires a current context.
+ */
+void QQuickRenderControl::stop()
+{
+ Q_D(QQuickRenderControl);
+ if (!d->window)
+ return;
+
+ QQuickWindowPrivate *cd = QQuickWindowPrivate::get(d->window);
+ cd->fireAboutToStop();
+ cd->cleanupNodesOnShutdown();
+
+ if (!cd->persistentSceneGraph) {
+ d->rc->invalidate();
+ QCoreApplication::sendPostedEvents(0, QEvent::DeferredDelete);
+ }
+}
+
+/*!
Render the scenegraph using the current context.
*/
void QQuickRenderControl::render()
diff --git a/src/quick/items/qquickrendercontrol_p.h b/src/quick/items/qquickrendercontrol_p.h
index 7255a9ae0b..98dc946303 100644
--- a/src/quick/items/qquickrendercontrol_p.h
+++ b/src/quick/items/qquickrendercontrol_p.h
@@ -71,6 +71,7 @@ public:
void polishItems();
void render();
bool sync();
+ void stop();
QImage grab();
diff --git a/src/quickwidgets/qquickwidget.cpp b/src/quickwidgets/qquickwidget.cpp
index d530e0c18f..147762c66f 100644
--- a/src/quickwidgets/qquickwidget.cpp
+++ b/src/quickwidgets/qquickwidget.cpp
@@ -769,18 +769,27 @@ void QQuickWidget::mouseDoubleClickEvent(QMouseEvent *e)
d->offscreenWindow->mouseDoubleClickEvent(&mappedEvent);
}
-void QQuickWidget::showEvent(QShowEvent *e)
+void QQuickWidget::showEvent(QShowEvent *)
{
Q_D(QQuickWidget);
QQuickWindowPrivate::get(d->offscreenWindow)->forceRendering = true;
- d->offscreenWindow->showEvent(e);
+
+ d->updatePending = false;
+ triggerUpdate();
}
-void QQuickWidget::hideEvent(QHideEvent *e)
+void QQuickWidget::hideEvent(QHideEvent *)
{
Q_D(QQuickWidget);
QQuickWindowPrivate::get(d->offscreenWindow)->forceRendering = false;
- d->offscreenWindow->hideEvent(e);
+
+ QOpenGLContext *context = d->offscreenWindow->openglContext();
+ if (!context) {
+ qWarning("QQuickWidget::hideEvent with no context");
+ return;
+ }
+ context->makeCurrent(d->offscreenWindow);
+ d->renderControl->stop();
}
/*! \reimp */