diff options
author | Määttä Antti <antti.maatta@qt.io> | 2017-04-12 14:26:41 +0300 |
---|---|---|
committer | Jani Heikkinen <jani.heikkinen@qt.io> | 2017-05-09 08:59:20 +0000 |
commit | 540f11b0b3f1639990383e2a4c72f858b0ac01b2 (patch) | |
tree | 9778876f85990f285078c84a5a913ff53b6bbdd7 | |
parent | bb0f4b48390b5ddc9758f04f6ecd692072fb279f (diff) |
Scene2D cleanup - remove qml engine and source
Remove QQmlEngine constructor and source property. Update unit tests and
manual tests accordingly.
Task-number: QTBUG-58876
Change-Id: Ide06bb1381f48efa5378f9a008476734a33089c1
Reviewed-by: Sean Harmer <sean.harmer@kdab.com>
Reviewed-by: Antti Määttä <antti.maatta@qt.io>
-rw-r--r-- | src/quick3d/quick3dscene2d/items/qscene2d.cpp | 78 | ||||
-rw-r--r-- | src/quick3d/quick3dscene2d/items/qscene2d.h | 12 | ||||
-rw-r--r-- | src/quick3d/quick3dscene2d/items/scene2dmanager.cpp | 112 | ||||
-rw-r--r-- | src/quick3d/quick3dscene2d/items/scene2dmanager_p.h | 12 | ||||
-rw-r--r-- | tests/auto/render/qscene2d/tst_qscene2d.cpp | 55 | ||||
-rw-r--r-- | tests/manual/render-qml-to-texture/main.cpp | 8 |
6 files changed, 15 insertions, 262 deletions
diff --git a/src/quick3d/quick3dscene2d/items/qscene2d.cpp b/src/quick3d/quick3dscene2d/items/qscene2d.cpp index 3470ac9d8..cc8c0b4fe 100644 --- a/src/quick3d/quick3dscene2d/items/qscene2d.cpp +++ b/src/quick3d/quick3dscene2d/items/qscene2d.cpp @@ -91,20 +91,10 @@ namespace Quick { */ /*! - \qmlproperty QUrl Qt3D.Render::Scene2D::source - Holds the qml source url. - */ - -/*! \qmlproperty enumeration Qt3D.Render::Scene2D::renderPolicy Holds the render policy of this Scene2D. */ -/*! - \qmlproperty bool Qt3D.Render::Scene2D::loaded - Holds whether the source has been loaded. - */ - QScene2DPrivate::QScene2DPrivate() : Qt3DCore::QNodePrivate() , m_renderManager(new Scene2DManager(this)) @@ -125,56 +115,6 @@ QScene2DPrivate::~QScene2DPrivate() QScene2D::QScene2D(Qt3DCore::QNode *parent) : Qt3DCore::QNode(*new QScene2DPrivate, parent) { - Q_D(QScene2D); - connect(d->m_renderManager, &Scene2DManager::onLoadedChanged, - 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() -{ -} - -bool QScene2D::loaded() const -{ - Q_D(const QScene2D); - return d->m_renderManager->m_initialized; -} - -/*! - \property QScene2D::source - \brief Specifies the url for the qml. - - This property specifies the url to the qml being rendered to the texture. - The source must specify QQuickItem as a root. The item must specify width - and height. The rendered qml is scaled to the texture size. - The property can not be changed after the rendering has been initialized. - */ -QUrl QScene2D::source() const -{ - Q_D(const QScene2D); - return d->m_renderManager->m_source; -} - -void QScene2D::setSource(const QUrl &url) -{ - Q_D(QScene2D); - if (d->m_renderManager->m_initialized) { - qWarning() << "Unable to set source after initialization."; - return; - } - if (d->m_renderManager->m_source != url) { - d->m_renderManager->setSource(url); - emit sourceChanged(url); - } } QQuickItem* QScene2D::item() const @@ -260,30 +200,12 @@ bool QScene2D::event(QEvent *event) return true; } -/*! - Returns the qml engine used by the QScene2D. - */ -QQmlEngine *QScene2D::engine() const -{ - Q_D(const QScene2D); - return d->m_renderManager->m_qmlEngine; -} - bool QScene2D::isGrabMouseEnabled() const { Q_D(const QScene2D); return d->m_renderManager->m_grabMouse; } -/*! - \internal - */ -void QScene2D::sourceLoaded() -{ - emit loadedChanged(true); -} - - QVector<Qt3DCore::QEntity*> QScene2D::entities() { Q_D(const QScene2D); diff --git a/src/quick3d/quick3dscene2d/items/qscene2d.h b/src/quick3d/quick3dscene2d/items/qscene2d.h index 2c982668a..b40cff536 100644 --- a/src/quick3d/quick3dscene2d/items/qscene2d.h +++ b/src/quick3d/quick3dscene2d/items/qscene2d.h @@ -60,9 +60,7 @@ class QT3DQUICKSCENE2DSHARED_EXPORT QScene2D : public Qt3DCore::QNode Q_OBJECT Q_PROPERTY(Qt3DRender::QRenderTargetOutput *output READ output WRITE setOutput NOTIFY outputChanged) - Q_PROPERTY(QUrl source READ source WRITE setSource NOTIFY sourceChanged) Q_PROPERTY(QScene2D::RenderPolicy renderPolicy READ renderPolicy WRITE setRenderPolicy NOTIFY renderPolicyChanged) - Q_PROPERTY(bool loaded READ loaded NOTIFY loadedChanged) Q_PROPERTY(QQuickItem *item READ item WRITE setItem NOTIFY itemChanged) Q_PROPERTY(bool grabMouse READ isGrabMouseEnabled WRITE setGrabMouseEnabled NOTIFY grabMouseChanged) @@ -77,15 +75,10 @@ public: Q_ENUM(RenderPolicy) explicit QScene2D(Qt3DCore::QNode *parent = nullptr); - QScene2D(QQmlEngine *engine, Qt3DCore::QNode *parent = nullptr); - ~QScene2D(); Qt3DRender::QRenderTargetOutput *output() const; - QUrl source() const; - bool loaded() const; QScene2D::RenderPolicy renderPolicy() const; QQuickItem *item() const; - QQmlEngine *engine() const; bool isGrabMouseEnabled() const; bool event(QEvent *event) Q_DECL_OVERRIDE; @@ -96,15 +89,12 @@ public: public Q_SLOTS: void setOutput(Qt3DRender::QRenderTargetOutput *output); - void setSource(const QUrl &url); void setRenderPolicy(QScene2D::RenderPolicy policy); void setItem(QQuickItem *item); void setGrabMouseEnabled(bool grab); Q_SIGNALS: void outputChanged(Qt3DRender::QRenderTargetOutput *output); - void sourceChanged(const QUrl &url); - void loadedChanged(bool loaded); void renderPolicyChanged(QScene2D::RenderPolicy policy); void itemChanged(QQuickItem *item); void grabMouseChanged(bool grab); @@ -114,8 +104,6 @@ protected: private: Qt3DCore::QNodeCreatedChangeBasePtr createNodeCreationChange() const Q_DECL_OVERRIDE; - - void sourceLoaded(); }; } // namespace Quick diff --git a/src/quick3d/quick3dscene2d/items/scene2dmanager.cpp b/src/quick3d/quick3dscene2d/items/scene2dmanager.cpp index f0d6a6e34..3a83a36fd 100644 --- a/src/quick3d/quick3dscene2d/items/scene2dmanager.cpp +++ b/src/quick3d/quick3dscene2d/items/scene2dmanager.cpp @@ -72,9 +72,7 @@ QWindow *RenderControl::renderWindow(QPoint *offset) Constructs qml render manager. */ Scene2DManager::Scene2DManager(QScene2DPrivate *priv) - : m_qmlEngine(nullptr) - , m_qmlComponent(nullptr) - , m_rootItem(nullptr) + : m_rootItem(nullptr) , m_item(nullptr) , m_priv(priv) , m_sharedObject(new Scene2DSharedObject(this)) @@ -83,8 +81,6 @@ Scene2DManager::Scene2DManager(QScene2DPrivate *priv) , m_initialized(false) , m_renderSyncRequested(false) , m_backendInitialized(false) - , m_noSourceMode(false) - , m_ownEngine(false) , m_grabMouse(false) { m_sharedObject->m_surface = new QOffscreenSurface; @@ -135,38 +131,17 @@ void Scene2DManager::requestRenderSync() void Scene2DManager::startIfInitialized() { - if (!m_initialized && m_backendInitialized) { - if (m_source.isValid() && !m_noSourceMode) { - // Create a QML engine. - 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, - this, &Scene2DManager::run); - } else { - run(); - } - } else if (m_item != nullptr) { - m_rootItem = m_item; + if (!m_initialized && m_backendInitialized && m_item != nullptr) { + m_rootItem = m_item; - // Associate root item with the window. - m_rootItem->setParentItem(m_sharedObject->m_quickWindow->contentItem()); + // Associate root item with the window. + m_rootItem->setParentItem(m_sharedObject->m_quickWindow->contentItem()); - // Update window size. - updateSizes(); + // Update window size. + updateSizes(); - m_initialized = true; - m_sharedObject->setInitialized(); - } + m_initialized = true; + m_sharedObject->setInitialized(); } } @@ -177,52 +152,7 @@ void Scene2DManager::stopAndClean() m_sharedObject->requestQuit(); m_sharedObject->wait(); m_sharedObject->cleanup(); - if (m_ownEngine) { - QObject::disconnect(m_connection); - delete m_qmlEngine; - } - delete m_qmlComponent; - m_qmlEngine = nullptr; - m_qmlComponent = nullptr; - } -} - -void Scene2DManager::run() -{ - disconnect(m_qmlComponent, &QQmlComponent::statusChanged, this, &Scene2DManager::run); - - if (m_qmlComponent->isError()) { - QList<QQmlError> errorList = m_qmlComponent->errors(); - for (const QQmlError &error: errorList) - qWarning() << error.url() << error.line() << error; - return; - } - - QObject *rootObject = m_qmlComponent->create(); - if (m_qmlComponent->isError()) { - QList<QQmlError> errorList = m_qmlComponent->errors(); - for (const QQmlError &error: errorList) - qWarning() << error.url() << error.line() << error; - return; - } - - m_rootItem = qobject_cast<QQuickItem *>(rootObject); - if (!m_rootItem) { - qWarning("QScene2D: Root item is not a QQuickItem."); - delete rootObject; - return; } - - // The root item is ready. Associate it with the window. - m_rootItem->setParentItem(m_sharedObject->m_quickWindow->contentItem()); - - // Update window size. - updateSizes(); - - m_initialized = true; - m_sharedObject->setInitialized(); - - emit onLoadedChanged(); } void Scene2DManager::updateSizes() @@ -236,15 +166,8 @@ void Scene2DManager::updateSizes() m_sharedObject->m_quickWindow->setGeometry(0, 0, width, height); } -void Scene2DManager::setSource(const QUrl &url) -{ - m_source = url; - startIfInitialized(); -} - void Scene2DManager::setItem(QQuickItem *item) { - m_noSourceMode = true; m_item = item; startIfInitialized(); } @@ -346,23 +269,6 @@ 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; -} - } // namespace Quick } // namespace Qt3DRender diff --git a/src/quick3d/quick3dscene2d/items/scene2dmanager_p.h b/src/quick3d/quick3dscene2d/items/scene2dmanager_p.h index d3c3a60a2..5f199969e 100644 --- a/src/quick3d/quick3dscene2d/items/scene2dmanager_p.h +++ b/src/quick3d/quick3dscene2d/items/scene2dmanager_p.h @@ -75,25 +75,19 @@ public: Scene2DManager(QScene2DPrivate *priv); ~Scene2DManager(); - QQmlEngine *m_qmlEngine; - QQmlComponent *m_qmlComponent; QQuickItem *m_rootItem; QQuickItem *m_item; QScene2DPrivate *m_priv; QSharedPointer<Scene2DSharedObject> m_sharedObject; - QUrl m_source; Qt3DCore::QNodeId m_id; - QMetaObject::Connection m_connection; QScene2D::RenderPolicy m_renderPolicy; bool m_requested; bool m_initialized; bool m_renderSyncRequested; bool m_backendInitialized; - bool m_noSourceMode; - bool m_ownEngine; bool m_grabMouse; void requestRender(); @@ -101,20 +95,14 @@ public: void doRenderSync(); void startIfInitialized(); void stopAndClean(); - void run(); void updateSizes(); - void setSource(const QUrl &url); void setItem(QQuickItem *item); bool event(QEvent *e) Q_DECL_OVERRIDE; bool forwardEvent(QEvent *event); - Q_SIGNAL void onLoadedChanged(); - void cleanup(); - void setEngine(QQmlEngine *engine); - void engineDestroyed(); }; } // namespace Quick diff --git a/tests/auto/render/qscene2d/tst_qscene2d.cpp b/tests/auto/render/qscene2d/tst_qscene2d.cpp index f0ff2db1e..61ac893e4 100644 --- a/tests/auto/render/qscene2d/tst_qscene2d.cpp +++ b/tests/auto/render/qscene2d/tst_qscene2d.cpp @@ -58,9 +58,7 @@ private Q_SLOTS: // THEN QCOMPARE(scene2d.output(), nullptr); - QCOMPARE(scene2d.source(), QUrl(QStringLiteral(""))); QCOMPARE(scene2d.renderPolicy(), QScene2D::Continuous); - QCOMPARE(scene2d.loaded(), false); QCOMPARE(scene2d.item(), nullptr); } @@ -92,25 +90,6 @@ private Q_SLOTS: } { // WHEN - QSignalSpy spy(&scene2d, SIGNAL(sourceChanged(QUrl))); - const QUrl newValue = QUrl(QStringLiteral("qrc://source.qml")); - scene2d.setSource(newValue); - - // THEN - QVERIFY(spy.isValid()); - QCOMPARE(scene2d.source(), newValue); - QCOMPARE(spy.count(), 1); - - // WHEN - spy.clear(); - scene2d.setSource(newValue); - - // THEN - QCOMPARE(scene2d.source(), newValue); - QCOMPARE(spy.count(), 0); - } - { - // WHEN QSignalSpy spy(&scene2d, SIGNAL(renderPolicyChanged(QScene2D::RenderPolicy))); const QScene2D::RenderPolicy newValue = QScene2D::SingleShot; scene2d.setRenderPolicy(newValue); @@ -156,7 +135,6 @@ private Q_SLOTS: QScopedPointer<Qt3DRender::QRenderTargetOutput> output(new Qt3DRender::QRenderTargetOutput()); scene2d.setOutput(output.data()); - scene2d.setSource(QUrl(QStringLiteral("qrc://source.qml"))); scene2d.setRenderPolicy(QScene2D::SingleShot); // WHEN @@ -242,39 +220,6 @@ private Q_SLOTS: } - void checkSourceUpdate() - { - // GIVEN - TestArbiter arbiter; - Qt3DRender::Quick::QScene2D scene2d; - arbiter.setArbiterOnNode(&scene2d); - - { - // WHEN - scene2d.setSource(QUrl(QStringLiteral("qrc://source.qml"))); - QCoreApplication::processEvents(); - - // THEN - QCOMPARE(arbiter.events.size(), 1); - auto change = arbiter.events.first().staticCast<Qt3DCore::QPropertyUpdatedChange>(); - QCOMPARE(change->propertyName(), "source"); - QCOMPARE(change->value().value<QUrl>(), scene2d.source()); - QCOMPARE(change->type(), Qt3DCore::PropertyUpdated); - - arbiter.events.clear(); - } - - { - // WHEN - scene2d.setSource(QUrl(QStringLiteral("qrc://source.qml"))); - QCoreApplication::processEvents(); - - // THEN - QCOMPARE(arbiter.events.size(), 0); - } - - } - void checkRenderPolicyUpdate() { // GIVEN diff --git a/tests/manual/render-qml-to-texture/main.cpp b/tests/manual/render-qml-to-texture/main.cpp index a2fc6ed09..2420c8560 100644 --- a/tests/manual/render-qml-to-texture/main.cpp +++ b/tests/manual/render-qml-to-texture/main.cpp @@ -37,6 +37,8 @@ #include <QGuiApplication> #include <QAnimationDriver> #include <QPropertyAnimation> +#include <QQmlComponent> +#include <QQmlEngine> #include <Qt3DCore/QEntity> #include <Qt3DCore/QAspectEngine> @@ -87,7 +89,7 @@ int main(int argc, char *argv[]) while (frameGraphNode->childNodes().size() > 0) frameGraphNode = (Qt3DRender::QFrameGraphNode*)frameGraphNode->childNodes().at(0); view.defaultFrameGraph()->setClearColor(QColor::fromRgbF(1.0f, 1.0f, 1.0f)); - Qt3DRender::Quick::QScene2D* qmlTextureRenderer = new Qt3DRender::Quick::QScene2D(frameGraphNode); + Qt3DRender::Quick::QScene2D *qmlTextureRenderer = new Qt3DRender::Quick::QScene2D(frameGraphNode); Qt3DRender::QTexture2D* offscreenTexture = new Qt3DRender::QTexture2D(qmlTextureRenderer); offscreenTexture->setSize(1024, 1024); @@ -102,7 +104,9 @@ int main(int argc, char *argv[]) output->setTexture(offscreenTexture); qmlTextureRenderer->setOutput(output); - qmlTextureRenderer->setSource(QUrl(QStringLiteral("qrc:/OffscreenGui.qml"))); + QQmlEngine engine; + QQmlComponent component(&engine, QUrl(QStringLiteral("qrc:/OffscreenGui.qml"))); + qmlTextureRenderer->setItem(static_cast<QQuickItem *>(component.create())); Qt3DCore::QEntity* planeEntity = new Qt3DCore::QEntity(sceneRoot); Qt3DExtras::QPlaneMesh* planeMesh = new Qt3DExtras::QPlaneMesh(planeEntity); |