summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAntti Määttä <antti.maatta@qt.io>2016-11-28 16:37:53 +0200
committerAntti Määttä <antti.maatta@qt.io>2017-01-27 12:06:43 +0000
commit7d1ba2e0676241634f38d907b10ae6e2bd2c6f0a (patch)
tree254c6ec7e4e27efbda4833f575a297bd3bff2657
parent29807dbcd23b47940311e45bbb789f1be1b8f66d (diff)
Add QmlEngine contructor parameter to Scene2D
Change-Id: I841f4f8e516d6b3656ed2dbc9ee694d25b4be78f Reviewed-by: Tomi Korpipää <tomi.korpipaa@qt.io> Reviewed-by: Sean Harmer <sean.harmer@kdab.com>
-rw-r--r--src/quick3d/quick3drender/scene2d/qscene2d.cpp52
-rw-r--r--src/quick3d/quick3drender/scene2d/qscene2d.h3
-rw-r--r--src/quick3d/quick3drender/scene2d/qscene2d_p.h4
3 files changed, 55 insertions, 4 deletions
diff --git a/src/quick3d/quick3drender/scene2d/qscene2d.cpp b/src/quick3d/quick3drender/scene2d/qscene2d.cpp
index a1f84a929..f83cd3e4f 100644
--- a/src/quick3d/quick3drender/scene2d/qscene2d.cpp
+++ b/src/quick3d/quick3drender/scene2d/qscene2d.cpp
@@ -236,6 +236,7 @@ Scene2DManager::Scene2DManager(QScene2DPrivate *priv)
, m_backendInitialized(false)
, m_noSourceMode(false)
, m_item(nullptr)
+ , m_ownEngine(false)
{
m_sharedObject->m_surface = new QOffscreenSurface;
m_sharedObject->m_surface->setFormat(QSurfaceFormat::defaultFormat());
@@ -288,11 +289,16 @@ void Scene2DManager::startIfInitialized()
if (!m_initialized && m_backendInitialized) {
if (m_source.isValid() && !m_noSourceMode) {
// Create a QML engine.
- m_qmlEngine = new QQmlEngine;
- if (!m_qmlEngine->incubationController())
- m_qmlEngine->setIncubationController(m_sharedObject->m_quickWindow->incubationController());
+ if (!m_qmlEngine) {
+ m_qmlEngine = new QQmlEngine;
+ if (!m_qmlEngine->incubationController()) {
+ m_qmlEngine->setIncubationController(m_sharedObject->m_quickWindow
+ ->incubationController());
+ }
+ }
// create component
+ m_ownEngine = true;
m_qmlComponent = new QQmlComponent(m_qmlEngine, m_source);
if (m_qmlComponent->isLoading()) {
connect(m_qmlComponent, &QQmlComponent::statusChanged,
@@ -322,7 +328,10 @@ void Scene2DManager::stopAndClean()
m_sharedObject->requestQuit();
m_sharedObject->wait();
m_sharedObject->cleanup();
- delete m_qmlEngine;
+ if (m_ownEngine) {
+ QObject::disconnect(m_connection);
+ delete m_qmlEngine;
+ }
delete m_qmlComponent;
m_qmlEngine = nullptr;
m_qmlComponent = nullptr;
@@ -488,6 +497,23 @@ void Scene2DManager::cleanup()
stopAndClean();
}
+void Scene2DManager::setEngine(QQmlEngine *engine)
+{
+ m_qmlEngine = engine;
+ m_ownEngine = false;
+ if (engine) {
+ m_connection = QObject::connect(engine, &QObject::destroyed,
+ this, &Scene2DManager::engineDestroyed);
+ }
+}
+
+void Scene2DManager::engineDestroyed()
+{
+ QObject::disconnect(m_connection);
+ m_qmlEngine = nullptr;
+ m_ownEngine = false;
+}
+
QScene2DPrivate::QScene2DPrivate()
: Qt3DCore::QNodePrivate()
@@ -514,6 +540,15 @@ QScene2D::QScene2D(Qt3DCore::QNode *parent)
this, &QScene2D::sourceLoaded);
}
+QScene2D::QScene2D(QQmlEngine *engine, Qt3DCore::QNode *parent)
+ : Qt3DCore::QNode(*new QScene2DPrivate, parent)
+{
+ Q_D(QScene2D);
+ connect(d->m_renderManager, &Scene2DManager::onLoadedChanged,
+ this, &QScene2D::sourceLoaded);
+ d->m_renderManager->setEngine(engine);
+}
+
QScene2D::~QScene2D()
{
}
@@ -638,6 +673,15 @@ bool QScene2D::event(QEvent *event)
}
/*!
+ Returns the qml engine used by the QScene2D.
+ */
+QQmlEngine *QScene2D::engine() const
+{
+ Q_D(const QScene2D);
+ return d->m_renderManager->m_qmlEngine;
+}
+
+/*!
\internal
*/
void QScene2D::sourceLoaded()
diff --git a/src/quick3d/quick3drender/scene2d/qscene2d.h b/src/quick3d/quick3drender/scene2d/qscene2d.h
index 67871f161..77ad6ea86 100644
--- a/src/quick3d/quick3drender/scene2d/qscene2d.h
+++ b/src/quick3d/quick3drender/scene2d/qscene2d.h
@@ -69,6 +69,7 @@ class QT3DQUICKRENDERSHARED_EXPORT QScene2D : public Qt3DCore::QNode
public:
explicit QScene2D(Qt3DCore::QNode *parent = nullptr);
+ QScene2D(QQmlEngine *engine, Qt3DCore::QNode *parent = nullptr);
~QScene2D();
Qt3DRender::QRenderTargetOutput *output() const;
@@ -76,7 +77,9 @@ public:
bool loaded() const;
bool renderOnce() const;
QQuickItem *item() const;
+ QQmlEngine *engine() const;
bool event(QEvent *event) Q_DECL_OVERRIDE;
+
public Q_SLOTS:
void setOutput(Qt3DRender::QRenderTargetOutput *output);
void setSource(const QUrl &url);
diff --git a/src/quick3d/quick3drender/scene2d/qscene2d_p.h b/src/quick3d/quick3drender/scene2d/qscene2d_p.h
index fbc19a42f..95f32f7c9 100644
--- a/src/quick3d/quick3drender/scene2d/qscene2d_p.h
+++ b/src/quick3d/quick3drender/scene2d/qscene2d_p.h
@@ -178,6 +178,7 @@ public:
QUrl m_source;
Qt3DCore::QNodeId m_id;
+ QMetaObject::Connection m_connection;
bool m_requested;
bool m_initialized;
@@ -185,6 +186,7 @@ public:
bool m_renderOnce;
bool m_backendInitialized;
bool m_noSourceMode;
+ bool m_ownEngine;
void requestRender();
void requestRenderSync();
@@ -203,6 +205,8 @@ public:
Q_SIGNAL void onLoadedChanged();
void cleanup();
+ void setEngine(QQmlEngine *engine);
+ void engineDestroyed();
};
} // namespace Quick