diff options
-rw-r--r-- | src/quickwidgets/qquickwidget.cpp | 12 | ||||
-rw-r--r-- | src/quickwidgets/qquickwidget_p.h | 4 | ||||
-rw-r--r-- | tests/auto/quickwidgets/qquickwidget/tst_qquickwidget.cpp | 6 |
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) |