diff options
author | Antti Määttä <antti.maatta@qt.io> | 2016-11-28 16:37:53 +0200 |
---|---|---|
committer | Antti Määttä <antti.maatta@qt.io> | 2017-01-27 12:06:43 +0000 |
commit | 7d1ba2e0676241634f38d907b10ae6e2bd2c6f0a (patch) | |
tree | 254c6ec7e4e27efbda4833f575a297bd3bff2657 | |
parent | 29807dbcd23b47940311e45bbb789f1be1b8f66d (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.cpp | 52 | ||||
-rw-r--r-- | src/quick3d/quick3drender/scene2d/qscene2d.h | 3 | ||||
-rw-r--r-- | src/quick3d/quick3drender/scene2d/qscene2d_p.h | 4 |
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 |