aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAllan Sandfeld Jensen <allan.jensen@theqtcompany.com>2016-06-27 11:55:33 +0200
committerAllan Sandfeld Jensen <allan.jensen@qt.io>2016-06-27 15:40:17 +0000
commit97212616d5a7fc68d9ee97015751326ec2908287 (patch)
treeada8f172265b097406489672cd29cda1029f4642
parentc9d4c8ed97694defea78184a80874764ebedfda1 (diff)
Lazy create QmlEngine on accessing rootContext
A common usecase appears to be to set variables in the rootContext before loading a url in a QQuickWidget. We there need to ensure there is a QmlEngine to set variables on when this is attempted. Change-Id: I07aff2104313eeb3fab902ea3c6043c3c82c50f7 Reviewed-by: Laszlo Agocs <laszlo.agocs@qt.io>
-rw-r--r--src/quickwidgets/qquickwidget.cpp12
-rw-r--r--src/quickwidgets/qquickwidget_p.h4
-rw-r--r--tests/auto/quickwidgets/qquickwidget/tst_qquickwidget.cpp6
3 files changed, 14 insertions, 8 deletions
diff --git a/src/quickwidgets/qquickwidget.cpp b/src/quickwidgets/qquickwidget.cpp
index 05097b3ce2..49e7affa31 100644
--- a/src/quickwidgets/qquickwidget.cpp
+++ b/src/quickwidgets/qquickwidget.cpp
@@ -109,13 +109,13 @@ void QQuickWidgetPrivate::init(QQmlEngine* e)
QObject::connect(renderControl, SIGNAL(sceneChanged()), q, SLOT(triggerUpdate()));
}
-void QQuickWidgetPrivate::ensureEngine()
+void QQuickWidgetPrivate::ensureEngine() const
{
- Q_Q(QQuickWidget);
+ Q_Q(const QQuickWidget);
if (!engine.isNull())
return;
- engine = new QQmlEngine(q);
+ engine = new QQmlEngine(const_cast<QQuickWidget*>(q));
engine.data()->setIncubationController(offscreenWindow->incubationController());
}
@@ -493,7 +493,8 @@ QUrl QQuickWidget::source() const
QQmlEngine* QQuickWidget::engine() const
{
Q_D(const QQuickWidget);
- return d->engine ? const_cast<QQmlEngine *>(d->engine.data()) : 0;
+ d->ensureEngine();
+ return const_cast<QQmlEngine *>(d->engine.data());
}
/*!
@@ -506,7 +507,8 @@ QQmlEngine* QQuickWidget::engine() const
QQmlContext* QQuickWidget::rootContext() const
{
Q_D(const QQuickWidget);
- return d->engine ? d->engine.data()->rootContext() : 0;
+ d->ensureEngine();
+ return d->engine.data()->rootContext();
}
/*!
diff --git a/src/quickwidgets/qquickwidget_p.h b/src/quickwidgets/qquickwidget_p.h
index f0e1f848e3..b01d634fcd 100644
--- a/src/quickwidgets/qquickwidget_p.h
+++ b/src/quickwidgets/qquickwidget_p.h
@@ -105,7 +105,7 @@ public:
QImage grabFramebuffer() Q_DECL_OVERRIDE;
void init(QQmlEngine* e = 0);
- void ensureEngine();
+ void ensureEngine() const;
void handleWindowChange();
void invalidateRenderControl();
@@ -115,7 +115,7 @@ public:
QUrl source;
- QPointer<QQmlEngine> engine;
+ mutable QPointer<QQmlEngine> engine;
QQmlComponent *component;
QBasicTimer resizetimer;
QQuickWindow *offscreenWindow;
diff --git a/tests/auto/quickwidgets/qquickwidget/tst_qquickwidget.cpp b/tests/auto/quickwidgets/qquickwidget/tst_qquickwidget.cpp
index 9b4d0dd7d1..ab2c41b6bf 100644
--- a/tests/auto/quickwidgets/qquickwidget/tst_qquickwidget.cpp
+++ b/tests/auto/quickwidgets/qquickwidget/tst_qquickwidget.cpp
@@ -305,9 +305,13 @@ void tst_qquickwidget::grabBeforeShow()
void tst_qquickwidget::nullEngine()
{
QQuickWidget widget;
- QVERIFY(widget.engine() == Q_NULLPTR);
+ // Default should have no errors, even with a null qml engine
QVERIFY(widget.errors().isEmpty());
QCOMPARE(widget.status(), QQuickWidget::Null);
+
+ // A QML engine should be created lazily.
+ QVERIFY(widget.rootContext());
+ QVERIFY(widget.engine());
}
QTEST_MAIN(tst_qquickwidget)