aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/quickwidgets/qquickwidget.cpp28
-rw-r--r--src/quickwidgets/qquickwidget_p.h1
-rw-r--r--tests/auto/quickwidgets/qquickwidget/tst_qquickwidget.cpp9
3 files changed, 26 insertions, 12 deletions
diff --git a/src/quickwidgets/qquickwidget.cpp b/src/quickwidgets/qquickwidget.cpp
index 2f43582529..05097b3ce2 100644
--- a/src/quickwidgets/qquickwidget.cpp
+++ b/src/quickwidgets/qquickwidget.cpp
@@ -96,10 +96,7 @@ void QQuickWidgetPrivate::init(QQmlEngine* e)
engine = e;
- if (engine.isNull())
- engine = new QQmlEngine(q);
-
- if (!engine.data()->incubationController())
+ if (!engine.isNull() && !engine.data()->incubationController())
engine.data()->setIncubationController(offscreenWindow->incubationController());
#ifndef QT_NO_DRAGANDDROP
@@ -112,6 +109,16 @@ void QQuickWidgetPrivate::init(QQmlEngine* e)
QObject::connect(renderControl, SIGNAL(sceneChanged()), q, SLOT(triggerUpdate()));
}
+void QQuickWidgetPrivate::ensureEngine()
+{
+ Q_Q(QQuickWidget);
+ if (!engine.isNull())
+ return;
+
+ engine = new QQmlEngine(q);
+ engine.data()->setIncubationController(offscreenWindow->incubationController());
+}
+
void QQuickWidgetPrivate::invalidateRenderControl()
{
if (!context) // this is not an error, could be called before creating the context, or multiple times
@@ -167,10 +174,7 @@ QQuickWidgetPrivate::~QQuickWidgetPrivate()
void QQuickWidgetPrivate::execute()
{
Q_Q(QQuickWidget);
- if (!engine) {
- qWarning() << "QQuickWidget: invalid qml engine.";
- return;
- }
+ ensureEngine();
if (root) {
delete root;
@@ -404,7 +408,6 @@ QQuickWidget::QQuickWidget(QQmlEngine* engine, QWidget *parent)
{
setMouseTracking(true);
setFocusPolicy(Qt::StrongFocus);
- Q_ASSERT(engine);
d_func()->init(engine);
}
@@ -548,7 +551,7 @@ QQmlContext* QQuickWidget::rootContext() const
QQuickWidget::Status QQuickWidget::status() const
{
Q_D(const QQuickWidget);
- if (!d->engine)
+ if (!d->engine && !d->source.isEmpty())
return QQuickWidget::Error;
if (!d->component)
@@ -574,11 +577,12 @@ QList<QQmlError> QQuickWidget::errors() const
if (d->component)
errs = d->component->errors();
- if (!d->engine) {
+ if (!d->engine && !d->source.isEmpty()) {
QQmlError error;
error.setDescription(QLatin1String("QQuickWidget: invalid qml engine."));
errs << error;
- } else if (d->component && d->component->status() == QQmlComponent::Ready && !d->root) {
+ }
+ if (d->component && d->component->status() == QQmlComponent::Ready && !d->root) {
QQmlError error;
error.setDescription(QLatin1String("QQuickWidget: invalid root object."));
errs << error;
diff --git a/src/quickwidgets/qquickwidget_p.h b/src/quickwidgets/qquickwidget_p.h
index fd3ef8fbbf..f0e1f848e3 100644
--- a/src/quickwidgets/qquickwidget_p.h
+++ b/src/quickwidgets/qquickwidget_p.h
@@ -105,6 +105,7 @@ public:
QImage grabFramebuffer() Q_DECL_OVERRIDE;
void init(QQmlEngine* e = 0);
+ void ensureEngine();
void handleWindowChange();
void invalidateRenderControl();
diff --git a/tests/auto/quickwidgets/qquickwidget/tst_qquickwidget.cpp b/tests/auto/quickwidgets/qquickwidget/tst_qquickwidget.cpp
index 09359060f6..9b4d0dd7d1 100644
--- a/tests/auto/quickwidgets/qquickwidget/tst_qquickwidget.cpp
+++ b/tests/auto/quickwidgets/qquickwidget/tst_qquickwidget.cpp
@@ -55,6 +55,7 @@ private slots:
void readback();
void renderingSignals();
void grabBeforeShow();
+ void nullEngine();
};
@@ -301,6 +302,14 @@ void tst_qquickwidget::grabBeforeShow()
QVERIFY(!widget.grab().isNull());
}
+void tst_qquickwidget::nullEngine()
+{
+ QQuickWidget widget;
+ QVERIFY(widget.engine() == Q_NULLPTR);
+ QVERIFY(widget.errors().isEmpty());
+ QCOMPARE(widget.status(), QQuickWidget::Null);
+}
+
QTEST_MAIN(tst_qquickwidget)
#include "tst_qquickwidget.moc"