aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCharles Yin <charles.yin@nokia.com>2012-05-03 11:36:36 +1000
committerQt by Nokia <qt-info@nokia.com>2012-05-23 05:28:54 +0200
commitefa9de71119853f89b4b175e7d537fbcc31a4848 (patch)
tree97ddef30cddfb41e708dea90e92bb1f247bc73be
parent8189f48ab2006c8cdd6e0f2683bed7b6a66a33fc (diff)
Introduce a new constructor to QQuickView
Make it possible let QQuickView use an existing qml engine and multiple QQuickView objects can share one QQmlEngine instance. Change-Id: I035d1c15155be22f1131b504c40cf4ffb5da0f45 Reviewed-by: Glenn Watson <glenn.watson@nokia.com>
-rw-r--r--src/quick/items/qquickview.cpp74
-rw-r--r--src/quick/items/qquickview.h1
-rw-r--r--src/quick/items/qquickview_p.h6
-rw-r--r--tests/auto/quick/qquickview/tst_qquickview.cpp38
4 files changed, 104 insertions, 15 deletions
diff --git a/src/quick/items/qquickview.cpp b/src/quick/items/qquickview.cpp
index 03a8e6ee89..b6b6f41a71 100644
--- a/src/quick/items/qquickview.cpp
+++ b/src/quick/items/qquickview.cpp
@@ -54,14 +54,19 @@
#include <private/qqmlengine_p.h>
#include <QtCore/qbasictimer.h>
-
QT_BEGIN_NAMESPACE
-void QQuickViewPrivate::init()
+void QQuickViewPrivate::init(QQmlEngine* e)
{
Q_Q(QQuickView);
- engine.setIncubationController(q->incubationController());
+ engine = e;
+
+ if (engine.isNull())
+ engine = new QQmlEngine(q);
+
+ if (!engine.data()->incubationController())
+ engine.data()->setIncubationController(q->incubationController());
if (QQmlDebugService::isDebuggingEnabled())
QQmlInspectorService::instance()->addView(q);
@@ -83,6 +88,11 @@ QQuickViewPrivate::~QQuickViewPrivate()
void QQuickViewPrivate::execute()
{
Q_Q(QQuickView);
+ if (!engine) {
+ qWarning() << "QQuickView: invalid qml engine.";
+ return;
+ }
+
if (root) {
delete root;
root = 0;
@@ -92,8 +102,8 @@ void QQuickViewPrivate::execute()
component = 0;
}
if (!source.isEmpty()) {
- QML_MEMORY_SCOPE_URL(engine.baseUrl().resolved(source));
- component = new QQmlComponent(&engine, source, q);
+ QML_MEMORY_SCOPE_URL(engine.data()->baseUrl().resolved(source));
+ component = new QQmlComponent(engine.data(), source, q);
if (!component->isLoading()) {
q->continueExecute();
} else {
@@ -153,9 +163,12 @@ void QQuickViewPrivate::itemGeometryChanged(QQuickItem *resizeItem, const QRectF
*/
/*!
- \fn QQuickView::QQuickView(QWindow *parent)
+ \fn QQuickView::QQuickView(QWindow *parent, Qt::WindowFlags f)
- Constructs a QQuickView with the given \a parent.
+ Constructs a QQuickView with the given \a parent and window flags \a f.
+ The default value of \a parent is 0, default window flags \a f is Qt::Window.
+
+ \sa Qt::WindowFlags
*/
QQuickView::QQuickView(QWindow *parent, Qt::WindowFlags f)
: QQuickCanvas(*(new QQuickViewPrivate), parent)
@@ -165,9 +178,12 @@ QQuickView::QQuickView(QWindow *parent, Qt::WindowFlags f)
}
/*!
- \fn QQuickView::QQuickView(const QUrl &source, QWidget *parent)
+ \fn QQuickView::QQuickView(const QUrl &source, QWidget *parent, Qt::WindowFlags f)
+
+ Constructs a QQuickView with the given QML \a source, \a parent and a window flags \a f.
+ The default value of \a parent is 0, default window flags \a f is Qt::Window.
- Constructs a QQuickView with the given QML \a source and \a parent.
+ \sa Qt::WindowFlags
*/
QQuickView::QQuickView(const QUrl &source, QWindow *parent, Qt::WindowFlags f)
: QQuickCanvas(*(new QQuickViewPrivate), parent)
@@ -177,6 +193,26 @@ QQuickView::QQuickView(const QUrl &source, QWindow *parent, Qt::WindowFlags f)
setSource(source);
}
+/*!
+ \fn QQuickView::QQuickView(QQmlEngine* engine, QWindow *parent, Qt::WindowFlags f)
+
+ Constructs a QQuickView with the given QML \a engine, \a parent and a window flags \a f.
+ The default value of \a parent is 0, default window flags \a f is Qt::Window.
+
+ Note: In this case, the QQuickView does not own the given \a engine object;
+ it is the caller's responsibility to destroy the engine. If the \a engine is deleted
+ before the view \a status() will return \a QQuickView::Error.
+
+ \sa Status, status(), errors(), Qt::WindowFlags
+*/
+QQuickView::QQuickView(QQmlEngine* engine, QWindow *parent, Qt::WindowFlags f)
+ : QQuickCanvas(*(new QQuickViewPrivate), parent)
+{
+ Q_ASSERT(engine);
+ setWindowFlags(f);
+ d_func()->init(engine);
+}
+
QQuickView::~QQuickView()
{
}
@@ -224,7 +260,7 @@ QUrl QQuickView::source() const
QQmlEngine* QQuickView::engine() const
{
Q_D(const QQuickView);
- return const_cast<QQmlEngine *>(&d->engine);
+ return d->engine ? const_cast<QQmlEngine *>(d->engine.data()) : 0;
}
/*!
@@ -237,7 +273,7 @@ QQmlEngine* QQuickView::engine() const
QQmlContext* QQuickView::rootContext() const
{
Q_D(const QQuickView);
- return d->engine.rootContext();
+ return d->engine ? d->engine.data()->rootContext() : 0;
}
/*!
@@ -267,6 +303,9 @@ QQmlContext* QQuickView::rootContext() const
QQuickView::Status QQuickView::status() const
{
Q_D(const QQuickView);
+ if (!d->engine)
+ return QQuickView::Error;
+
if (!d->component)
return QQuickView::Null;
@@ -280,9 +319,18 @@ QQuickView::Status QQuickView::status() const
QList<QQmlError> QQuickView::errors() const
{
Q_D(const QQuickView);
+ QList<QQmlError> errs;
+
if (d->component)
- return d->component->errors();
- return QList<QQmlError>();
+ errs = d->component->errors();
+
+ if (!d->engine) {
+ QQmlError error;
+ error.setDescription(QLatin1String("QQuickView: invalid qml engine."));
+ errs << error;
+ }
+
+ return errs;
}
/*!
diff --git a/src/quick/items/qquickview.h b/src/quick/items/qquickview.h
index 2143a80723..6ef3531080 100644
--- a/src/quick/items/qquickview.h
+++ b/src/quick/items/qquickview.h
@@ -65,6 +65,7 @@ class Q_QUICK_EXPORT QQuickView : public QQuickCanvas
Q_ENUMS(ResizeMode Status)
public:
explicit QQuickView(QWindow *parent = 0, Qt::WindowFlags f = Qt::Window);
+ QQuickView(QQmlEngine* engine, QWindow *parent, Qt::WindowFlags f = Qt::Window);
QQuickView(const QUrl &source, QWindow *parent = 0, Qt::WindowFlags f = Qt::Window);
virtual ~QQuickView();
diff --git a/src/quick/items/qquickview_p.h b/src/quick/items/qquickview_p.h
index 9b0e26e30d..00f7640c10 100644
--- a/src/quick/items/qquickview_p.h
+++ b/src/quick/items/qquickview_p.h
@@ -48,6 +48,8 @@
#include <QtCore/qelapsedtimer.h>
#include <QtCore/qtimer.h>
#include <QtCore/qpointer.h>
+#include <QtCore/QWeakPointer>
+
#include <QtQml/qqmlengine.h>
#include "qquickcanvas_p.h"
@@ -79,7 +81,7 @@ public:
void updateSize();
void setRootObject(QObject *);
- void init();
+ void init(QQmlEngine* e = 0);
QSize rootObjectSize() const;
@@ -87,7 +89,7 @@ public:
QUrl source;
- QQmlEngine engine;
+ QWeakPointer<QQmlEngine> engine;
QQmlComponent *component;
QBasicTimer resizetimer;
diff --git a/tests/auto/quick/qquickview/tst_qquickview.cpp b/tests/auto/quick/qquickview/tst_qquickview.cpp
index e5e8a83424..cb2f5c60f3 100644
--- a/tests/auto/quick/qquickview/tst_qquickview.cpp
+++ b/tests/auto/quick/qquickview/tst_qquickview.cpp
@@ -47,6 +47,7 @@
#include "../../shared/util.h"
#include <QtGui/QWindow>
#include <QtCore/QDebug>
+#include <QtQml/qqmlengine.h>
class tst_QQuickView : public QQmlDataTest
{
@@ -57,6 +58,7 @@ public:
private slots:
void resizemodeitem();
void errors();
+ void engine();
};
@@ -201,6 +203,42 @@ void tst_QQuickView::errors()
delete canvas;
}
+void tst_QQuickView::engine()
+{
+ QQmlEngine *engine = new QQmlEngine;
+ QVERIFY(!engine->incubationController());
+
+ QQuickView *canvas = new QQuickView(engine, 0);
+ QVERIFY(canvas);
+ QVERIFY(engine->incubationController() == canvas->incubationController());
+
+ QQuickView *canvas2 = new QQuickView(engine, 0);
+ QVERIFY(canvas);
+ QVERIFY(engine->incubationController() == canvas->incubationController());
+ delete canvas;
+ QVERIFY(!engine->incubationController());
+
+ engine->setIncubationController(canvas2->incubationController());
+ QVERIFY(engine->incubationController() == canvas2->incubationController());
+ delete canvas2;
+ QVERIFY(!engine->incubationController());
+
+ QQuickView *canvas3 = new QQuickView;
+ QQuickView *canvas4 = new QQuickView(canvas3->engine(), 0);
+
+ QVERIFY(canvas3->engine());
+ QVERIFY(canvas4->engine());
+ QCOMPARE(canvas3->engine(), canvas4->engine());
+ delete canvas3;
+ QVERIFY(!canvas4->engine());
+ QTest::ignoreMessage(QtWarningMsg, "QQuickView: invalid qml engine. ");
+ canvas4->setSource(QUrl());
+
+ QCOMPARE(canvas4->status(), QQuickView::Error);
+ QVERIFY(!canvas4->errors().isEmpty());
+ QCOMPARE(canvas4->errors().back().description(), QLatin1String("QQuickView: invalid qml engine."));
+ delete canvas4;
+}
QTEST_MAIN(tst_QQuickView)