aboutsummaryrefslogtreecommitdiffstats
path: root/src/quickwidgets
diff options
context:
space:
mode:
authorAllan Sandfeld Jensen <allan.jensen@theqtcompany.com>2016-06-24 10:22:47 +0200
committerAllan Sandfeld Jensen <allan.jensen@qt.io>2016-06-24 11:59:34 +0000
commitc9d4c8ed97694defea78184a80874764ebedfda1 (patch)
treedd7d92abb747e6729f90184b7fc8e4e4c6af4be2 /src/quickwidgets
parentb90f810ffa5a7f98b0ac58e5812bcdcd66d028bc (diff)
Create QmlEngine lazy in case one is not needed
QQuickWidget may be used with just a root item, and won't need a QmlEngine in that case. So if one isn't given to the constructor, only create one when one is needed for evaluating source. Change-Id: I96cfe5e2473d5d53fc2d52d4646d36c43f4ccb8a Reviewed-by: Laszlo Agocs <laszlo.agocs@qt.io>
Diffstat (limited to 'src/quickwidgets')
-rw-r--r--src/quickwidgets/qquickwidget.cpp28
-rw-r--r--src/quickwidgets/qquickwidget_p.h1
2 files changed, 17 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();