From f862b3edeb8a96a49a5d12620506d33d5a5aadca Mon Sep 17 00:00:00 2001 From: Ulf Hermann Date: Mon, 2 Sep 2019 10:49:32 +0200 Subject: Make QQmlValueTypeFactory::valueType() and isValueType() consistent If isValueType() returns true, we should really return a non-null value from valueType(). Otherwise the assumption that QQmlValueTypeWrapper::valueType is never null breaks. In particular, the unknown type and various primitive types are _not_ value types. We special case the, probably common, UnknownType and check the actual return value of valueType() for anything else. In order to avoid looking up the metaobject each time we request a type that is not a value type, we keep an invalid value type as marker for "not checked yet" and replace that with nullptr once we determine that the type in question is indeed not a value type. Fixes: QTBUG-76866 Change-Id: I797f4cdd4db48ffc1b8fa2d919afc8022f67fa94 Reviewed-by: Simon Hausmann --- .../qmldbg_debugger/qqmlenginedebugservice.cpp | 20 ++++++++------------ .../qmltooling/qmldbg_debugger/qqmlwatcher.cpp | 7 +------ 2 files changed, 9 insertions(+), 18 deletions(-) (limited to 'src/plugins') diff --git a/src/plugins/qmltooling/qmldbg_debugger/qqmlenginedebugservice.cpp b/src/plugins/qmltooling/qmldbg_debugger/qqmlenginedebugservice.cpp index d0f9833c2e..be83f63bfc 100644 --- a/src/plugins/qmltooling/qmldbg_debugger/qqmlenginedebugservice.cpp +++ b/src/plugins/qmltooling/qmldbg_debugger/qqmlenginedebugservice.cpp @@ -191,22 +191,18 @@ QQmlEngineDebugServiceImpl::propertyData(QObject *obj, int propIdx) if (binding) rv.binding = binding->expression(); - if (QQmlValueTypeFactory::isValueType(prop.userType())) { - rv.type = QQmlObjectProperty::Basic; - } else if (QQmlMetaType::isQObject(prop.userType())) { + rv.value = valueContents(prop.read(obj)); + + if (QQmlMetaType::isQObject(prop.userType())) { rv.type = QQmlObjectProperty::Object; } else if (QQmlMetaType::isList(prop.userType())) { rv.type = QQmlObjectProperty::List; } else if (prop.userType() == QMetaType::QVariant) { rv.type = QQmlObjectProperty::Variant; + } else if (rv.value.isValid()) { + rv.type = QQmlObjectProperty::Basic; } - QVariant value; - if (rv.type != QQmlObjectProperty::Unknown && prop.userType() != 0) { - value = prop.read(obj); - } - rv.value = valueContents(value); - return rv; } @@ -269,10 +265,10 @@ QVariant QQmlEngineDebugServiceImpl::valueContents(QVariant value) const return s; } } - - if (isSaveable(value)) - return value; } + + if (isSaveable(value)) + return value; } if (QQmlMetaType::isQObject(userType)) { diff --git a/src/plugins/qmltooling/qmldbg_debugger/qqmlwatcher.cpp b/src/plugins/qmltooling/qmldbg_debugger/qqmlwatcher.cpp index 86571e6cbe..8caa5ac23e 100644 --- a/src/plugins/qmltooling/qmldbg_debugger/qqmlwatcher.cpp +++ b/src/plugins/qmltooling/qmldbg_debugger/qqmlwatcher.cpp @@ -109,12 +109,7 @@ QQmlWatchProxy::QQmlWatchProxy(int id, void QQmlWatchProxy::notifyValueChanged() { - QVariant v; - if (m_expr) - v = m_expr->evaluate(); - else if (QQmlValueTypeFactory::isValueType(m_property.userType())) - v = m_property.read(m_object); - + const QVariant v = m_expr ? m_expr->evaluate() : m_property.read(m_object); emit m_watch->propertyChanged(m_id, m_debugId, m_property, v); } -- cgit v1.2.3 From abc0fc64b3d797af4d47cd2f7e3df68a3114c120 Mon Sep 17 00:00:00 2001 From: Ulf Hermann Date: Mon, 30 Sep 2019 13:21:47 +0200 Subject: QQuickWindow: Don't leak the animation controller There are ways to close the window without hitting the code paths in the render loops that delete the animation controller. Probably if no frame was ever rendered. Change-Id: If3e9d2051525c4ff50eda19084c967578fe4f4b0 Reviewed-by: Simon Hausmann --- src/plugins/scenegraph/d3d12/qsgd3d12renderloop.cpp | 2 +- src/plugins/scenegraph/d3d12/qsgd3d12threadedrenderloop.cpp | 4 ++-- src/plugins/scenegraph/openvg/qsgopenvgrenderloop.cpp | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) (limited to 'src/plugins') diff --git a/src/plugins/scenegraph/d3d12/qsgd3d12renderloop.cpp b/src/plugins/scenegraph/d3d12/qsgd3d12renderloop.cpp index 0d501f48c0..4a6894e69e 100644 --- a/src/plugins/scenegraph/d3d12/qsgd3d12renderloop.cpp +++ b/src/plugins/scenegraph/d3d12/qsgd3d12renderloop.cpp @@ -148,7 +148,7 @@ void QSGD3D12RenderLoop::windowDestroyed(QQuickWindow *window) delete rc; delete engine; - delete wd->animationController; + wd->animationController.reset(); } void QSGD3D12RenderLoop::exposeWindow(QQuickWindow *window) diff --git a/src/plugins/scenegraph/d3d12/qsgd3d12threadedrenderloop.cpp b/src/plugins/scenegraph/d3d12/qsgd3d12threadedrenderloop.cpp index f505df1e5a..4302a9119b 100644 --- a/src/plugins/scenegraph/d3d12/qsgd3d12threadedrenderloop.cpp +++ b/src/plugins/scenegraph/d3d12/qsgd3d12threadedrenderloop.cpp @@ -373,7 +373,7 @@ bool QSGD3D12RenderThread::event(QEvent *e) QCoreApplication::processEvents(); QCoreApplication::sendPostedEvents(0, QEvent::DeferredDelete); if (wme->destroying) - delete wd->animationController; + wd->animationController.reset(); } if (wme->destroying) active = false; @@ -1006,7 +1006,7 @@ void QSGD3D12ThreadedRenderLoop::handleExposure(QQuickWindow *window) if (Q_UNLIKELY(debug_loop())) qDebug("starting render thread"); // Push a few things to the render thread. - QQuickAnimatorController *controller = QQuickWindowPrivate::get(w->window)->animationController; + QQuickAnimatorController *controller = QQuickWindowPrivate::get(w->window)->animationController.data(); if (controller->thread() != w->thread) controller->moveToThread(w->thread); if (w->thread->thread() == QThread::currentThread()) { diff --git a/src/plugins/scenegraph/openvg/qsgopenvgrenderloop.cpp b/src/plugins/scenegraph/openvg/qsgopenvgrenderloop.cpp index 94f7f76036..69b10fcdee 100644 --- a/src/plugins/scenegraph/openvg/qsgopenvgrenderloop.cpp +++ b/src/plugins/scenegraph/openvg/qsgopenvgrenderloop.cpp @@ -96,7 +96,7 @@ void QSGOpenVGRenderLoop::windowDestroyed(QQuickWindow *window) vg->doneCurrent(); } - delete d->animationController; + d->animationController.reset(); } void QSGOpenVGRenderLoop::exposureChanged(QQuickWindow *window) -- cgit v1.2.3 From ce94b847c87e2606c5f189d2ad3715c1d025b9cf Mon Sep 17 00:00:00 2001 From: Albert Astals Cid Date: Fri, 4 Oct 2019 14:13:36 +0200 Subject: Small performance improvements suggested by clang-tidy mostly add const &, a few std::move and in particular case, remove const so the std::move being done over the variable actually has effect Change-Id: Id611cd31bc012f219d7a17d4626b1c2a5fbddd66 Reviewed-by: Fabian Kosmale Reviewed-by: Ulf Hermann --- src/plugins/qmltooling/qmldbg_server/qqmldebugserver.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/plugins') diff --git a/src/plugins/qmltooling/qmldbg_server/qqmldebugserver.cpp b/src/plugins/qmltooling/qmldbg_server/qqmldebugserver.cpp index 2d5282b48c..cc663cd6b3 100644 --- a/src/plugins/qmltooling/qmldbg_server/qqmldebugserver.cpp +++ b/src/plugins/qmltooling/qmldbg_server/qqmldebugserver.cpp @@ -506,7 +506,7 @@ void QQmlDebugServerImpl::receiveMessage() in >> m_clientPlugins; for (DebugServiceConstIt iter = m_plugins.constBegin(), cend = m_plugins.constEnd(); iter != cend; ++iter) { - const QString pluginName = iter.key(); + const QString &pluginName = iter.key(); QQmlDebugService::State newState = QQmlDebugService::Unavailable; if (m_clientPlugins.contains(pluginName)) newState = QQmlDebugService::Enabled; -- cgit v1.2.3 From edf36111860c78cd30b00e8fa9f8e4fbf8967cd1 Mon Sep 17 00:00:00 2001 From: Eirik Aavitsland Date: Tue, 1 Oct 2019 09:31:03 +0200 Subject: OpenVG: Fix rendering of non-affine transformed rectangles Perspective transforms need special handling in OpenVG. However, that was only done for rounded rectangles. Enable it for zero-radius rectangles too. Fixes: QTBUG-76589 Change-Id: Ibe2e0344dfde45f70f8f443fcd22d33e89eae286 Reviewed-by: Andy Nichols --- .../openvg/qsgopenvginternalrectanglenode.cpp | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) (limited to 'src/plugins') diff --git a/src/plugins/scenegraph/openvg/qsgopenvginternalrectanglenode.cpp b/src/plugins/scenegraph/openvg/qsgopenvginternalrectanglenode.cpp index d728686248..2c71c1610a 100644 --- a/src/plugins/scenegraph/openvg/qsgopenvginternalrectanglenode.cpp +++ b/src/plugins/scenegraph/openvg/qsgopenvginternalrectanglenode.cpp @@ -211,21 +211,14 @@ void QSGOpenVGInternalRectangleNode::render() } else { vgSeti(VG_MATRIX_MODE, VG_MATRIX_PATH_USER_TO_SURFACE); vgLoadIdentity(); - if (m_radius > 0) { - // Fallback to rendering to an image for rounded rects with perspective transforms - if (m_offscreenSurface == nullptr || m_offscreenSurface->size() != QSize(std::ceil(m_rect.width()), std::ceil(m_rect.height()))) { - delete m_offscreenSurface; - m_offscreenSurface = new QOpenVGOffscreenSurface(QSize(std::ceil(m_rect.width()), std::ceil(m_rect.height()))); - } - - m_offscreenSurface->makeCurrent(); - } else if (m_offscreenSurface) { + // Fallback to rendering to an image for rounded rects with perspective transforms + if (m_offscreenSurface == nullptr || m_offscreenSurface->size() != QSize(std::ceil(m_rect.width()), std::ceil(m_rect.height()))) { delete m_offscreenSurface; - m_offscreenSurface = nullptr; + m_offscreenSurface = new QOpenVGOffscreenSurface(QSize(std::ceil(m_rect.width()), std::ceil(m_rect.height()))); } + m_offscreenSurface->makeCurrent(); } - // If path is dirty if (m_pathDirty) { vgClearPath(m_rectanglePath, VG_PATH_CAPABILITY_APPEND_TO); @@ -291,7 +284,7 @@ void QSGOpenVGInternalRectangleNode::render() vgDrawPath(m_rectanglePath, VG_FILL_PATH); } - if (!transform().isAffine() && m_radius > 0) { + if (!transform().isAffine()) { m_offscreenSurface->doneCurrent(); // Render offscreen surface vgSeti(VG_MATRIX_MODE, VG_MATRIX_IMAGE_USER_TO_SURFACE); -- cgit v1.2.3 From 8e49f5060632451f6b2c4cb3597aed7308490f39 Mon Sep 17 00:00:00 2001 From: Eirik Aavitsland Date: Tue, 1 Oct 2019 10:44:31 +0200 Subject: OpenVG: Fix emitting of sceneGraphInitialized and -Invalidated These QQuickWindow signals were not emitted when using the OpenVG backed. The reason was that the OpenVG scenegraph context, unlike other backend contexts, did not signal when it was initialized and invalidated. Fixes: QTBUG-76806 Change-Id: I2299b253464b71d4ca9c54c85359c6bcb0718d43 Reviewed-by: Andy Nichols --- src/plugins/scenegraph/openvg/qsgopenvgcontext.cpp | 2 ++ 1 file changed, 2 insertions(+) (limited to 'src/plugins') diff --git a/src/plugins/scenegraph/openvg/qsgopenvgcontext.cpp b/src/plugins/scenegraph/openvg/qsgopenvgcontext.cpp index 76ebb7c4ee..e4acda1ffd 100644 --- a/src/plugins/scenegraph/openvg/qsgopenvgcontext.cpp +++ b/src/plugins/scenegraph/openvg/qsgopenvgcontext.cpp @@ -72,6 +72,7 @@ void QSGOpenVGRenderContext::initialize(void *context) { m_vgContext = static_cast(context); QSGRenderContext::initialize(context); + emit initialized(); } void QSGOpenVGRenderContext::invalidate() @@ -80,6 +81,7 @@ void QSGOpenVGRenderContext::invalidate() delete m_glyphCacheManager; m_glyphCacheManager = nullptr; QSGRenderContext::invalidate(); + emit invalidated(); } void QSGOpenVGRenderContext::renderNextFrame(QSGRenderer *renderer, uint fboId) -- cgit v1.2.3 From 654c48f6746d0c57b4c708bd0e90e86921cc377f Mon Sep 17 00:00:00 2001 From: Eirik Aavitsland Date: Tue, 1 Oct 2019 13:45:46 +0200 Subject: OpenVG: Fix delivery of touch events By default, touch events are compressed and then delivered on window update. However, the OpenVG render loop, unlike the other backends, did not flush the queued events during rendering. Fixes: QTBUG-76526 Change-Id: Ifbcc90aa7d1942ba2104fa81eb46fdb79b593bb9 Reviewed-by: Andy Nichols --- src/plugins/scenegraph/openvg/qsgopenvgrenderloop.cpp | 1 + 1 file changed, 1 insertion(+) (limited to 'src/plugins') diff --git a/src/plugins/scenegraph/openvg/qsgopenvgrenderloop.cpp b/src/plugins/scenegraph/openvg/qsgopenvgrenderloop.cpp index c41dfd7400..994ac251e3 100644 --- a/src/plugins/scenegraph/openvg/qsgopenvgrenderloop.cpp +++ b/src/plugins/scenegraph/openvg/qsgopenvgrenderloop.cpp @@ -185,6 +185,7 @@ void QSGOpenVGRenderLoop::renderWindow(QQuickWindow *window) data.updatePending = false; if (!data.grabOnly) { + cd->flushFrameSynchronousEvents(); // Event delivery/processing triggered the window to be deleted or stop rendering. if (!m_windows.contains(window)) return; -- cgit v1.2.3 From f4744a77224009cb46a254614106b9034a84fd4f Mon Sep 17 00:00:00 2001 From: Eirik Aavitsland Date: Wed, 2 Oct 2019 09:45:57 +0200 Subject: Fix sprites leaking textures in SW and OpenVG backends When a QSGSpriteNode is initialized with a texture, it is supposed to take ownership of the texture and delete it when the node gets deleted. In the default backend, this happens automatically: The texture gets assigned to the node's QSGMaterial object, and the node has set the OwnsMaterial flag, and so the inherited QSGGeometry destructor takes care of deleting the material, which deletes the texture. However, the Software and OpenVG backends do not have material objects, so the above mechanism does not apply, and so the texture objects are leaked. Fix by deleting the texture object directly from the SoftwareSpriteNode and OpenVGSpriteNode destructors. Fixes: QTBUG-77019 Change-Id: I503d704f66593ba6a36c969db80f74f715382b6b Reviewed-by: Andy Nichols --- src/plugins/scenegraph/openvg/qsgopenvgspritenode.cpp | 2 +- src/plugins/scenegraph/openvg/qsgopenvgspritenode.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'src/plugins') diff --git a/src/plugins/scenegraph/openvg/qsgopenvgspritenode.cpp b/src/plugins/scenegraph/openvg/qsgopenvgspritenode.cpp index fb24df7471..1b75d450aa 100644 --- a/src/plugins/scenegraph/openvg/qsgopenvgspritenode.cpp +++ b/src/plugins/scenegraph/openvg/qsgopenvgspritenode.cpp @@ -52,7 +52,7 @@ QSGOpenVGSpriteNode::QSGOpenVGSpriteNode() QSGOpenVGSpriteNode::~QSGOpenVGSpriteNode() { - + delete m_texture; } void QSGOpenVGSpriteNode::setTexture(QSGTexture *texture) diff --git a/src/plugins/scenegraph/openvg/qsgopenvgspritenode.h b/src/plugins/scenegraph/openvg/qsgopenvgspritenode.h index d47b389a0b..dba4e663be 100644 --- a/src/plugins/scenegraph/openvg/qsgopenvgspritenode.h +++ b/src/plugins/scenegraph/openvg/qsgopenvgspritenode.h @@ -66,7 +66,7 @@ public: void render() override; private: - QSGOpenVGTexture *m_texture; + QSGOpenVGTexture *m_texture = nullptr; float m_time; QPoint m_sourceA; QPoint m_sourceB; -- cgit v1.2.3 From 0a0d9690a90340c4bd6d9503dc78abee70ea4739 Mon Sep 17 00:00:00 2001 From: Ulf Hermann Date: Wed, 9 Oct 2019 15:49:52 +0200 Subject: Consistently use qint32 as IDs and counts in engine debugger We should not sent unsigned numbers and read them as signed ones. The invalid ID is -1, and it's good style to use types of fixed size for the debug protocol. Fixes: QTBUG-79114 Change-Id: Ib6754ad893cc01d3fe7aa7f76fbd732df36d969a Reviewed-by: Simon Hausmann --- .../qmldbg_debugger/qqmlenginedebugservice.cpp | 41 +++++++++++----------- .../qmldbg_debugger/qqmlenginedebugservice.h | 3 +- 2 files changed, 23 insertions(+), 21 deletions(-) (limited to 'src/plugins') diff --git a/src/plugins/qmltooling/qmldbg_debugger/qqmlenginedebugservice.cpp b/src/plugins/qmltooling/qmldbg_debugger/qqmlenginedebugservice.cpp index be83f63bfc..029004ffd1 100644 --- a/src/plugins/qmltooling/qmldbg_debugger/qqmlenginedebugservice.cpp +++ b/src/plugins/qmltooling/qmldbg_debugger/qqmlenginedebugservice.cpp @@ -490,7 +490,7 @@ void QQmlEngineDebugServiceImpl::processMessage(const QByteArray &message) QQmlDebugPacket ds(message); QByteArray type; - int queryId; + qint32 queryId; ds >> type >> queryId; QQmlDebugPacket rs; @@ -503,13 +503,13 @@ void QQmlEngineDebugServiceImpl::processMessage(const QByteArray &message) QJSEngine *engine = m_engines.at(ii); QString engineName = engine->objectName(); - int engineId = QQmlDebugService::idForObject(engine); + qint32 engineId = QQmlDebugService::idForObject(engine); rs << engineName << engineId; } } else if (type == "LIST_OBJECTS") { - int engineId = -1; + qint32 engineId = -1; ds >> engineId; QQmlEngine *engine = @@ -532,7 +532,7 @@ void QQmlEngineDebugServiceImpl::processMessage(const QByteArray &message) } } else if (type == "FETCH_OBJECT") { - int objectId; + qint32 objectId; bool recurse; bool dumpProperties = true; @@ -550,8 +550,8 @@ void QQmlEngineDebugServiceImpl::processMessage(const QByteArray &message) } else if (type == "FETCH_OBJECTS_FOR_LOCATION") { QString file; - int lineNumber; - int columnNumber; + qint32 lineNumber; + qint32 columnNumber; bool recurse; bool dumpProperties = true; @@ -569,7 +569,7 @@ void QQmlEngineDebugServiceImpl::processMessage(const QByteArray &message) } } else if (type == "WATCH_OBJECT") { - int objectId; + qint32 objectId; ds >> objectId; bool ok = m_watch->addWatch(queryId, objectId); @@ -577,7 +577,7 @@ void QQmlEngineDebugServiceImpl::processMessage(const QByteArray &message) rs << QByteArray("WATCH_OBJECT_R") << queryId << ok; } else if (type == "WATCH_PROPERTY") { - int objectId; + qint32 objectId; QByteArray property; ds >> objectId >> property; @@ -586,7 +586,7 @@ void QQmlEngineDebugServiceImpl::processMessage(const QByteArray &message) rs << QByteArray("WATCH_PROPERTY_R") << queryId << ok; } else if (type == "WATCH_EXPR_OBJECT") { - int debugId; + qint32 debugId; QString expr; ds >> debugId >> expr; @@ -600,11 +600,11 @@ void QQmlEngineDebugServiceImpl::processMessage(const QByteArray &message) rs << QByteArray("NO_WATCH_R") << queryId << ok; } else if (type == "EVAL_EXPRESSION") { - int objectId; + qint32 objectId; QString expr; ds >> objectId >> expr; - int engineId = -1; + qint32 engineId = -1; if (!ds.atEnd()) ds >> engineId; @@ -632,12 +632,12 @@ void QQmlEngineDebugServiceImpl::processMessage(const QByteArray &message) rs << QByteArray("EVAL_EXPRESSION_R") << queryId << result; } else if (type == "SET_BINDING") { - int objectId; + qint32 objectId; QString propertyName; QVariant expr; bool isLiteralValue; QString filename; - int line; + qint32 line; ds >> objectId >> propertyName >> expr >> isLiteralValue >> filename >> line; bool ok = setBinding(objectId, propertyName, expr, isLiteralValue, @@ -646,7 +646,7 @@ void QQmlEngineDebugServiceImpl::processMessage(const QByteArray &message) rs << QByteArray("SET_BINDING_R") << queryId << ok; } else if (type == "RESET_BINDING") { - int objectId; + qint32 objectId; QString propertyName; ds >> objectId >> propertyName; bool ok = resetBinding(objectId, propertyName); @@ -654,7 +654,7 @@ void QQmlEngineDebugServiceImpl::processMessage(const QByteArray &message) rs << QByteArray("RESET_BINDING_R") << queryId << ok; } else if (type == "SET_METHOD_BODY") { - int objectId; + qint32 objectId; QString methodName; QString methodBody; ds >> objectId >> methodName >> methodBody; @@ -817,7 +817,8 @@ bool QQmlEngineDebugServiceImpl::setMethodBody(int objectId, const QString &meth return true; } -void QQmlEngineDebugServiceImpl::propertyChanged(int id, int objectId, const QMetaProperty &property, const QVariant &value) +void QQmlEngineDebugServiceImpl::propertyChanged( + qint32 id, qint32 objectId, const QMetaProperty &property, const QVariant &value) { QQmlDebugPacket rs; rs << QByteArray("UPDATE_WATCH") << id << objectId << QByteArray(property.name()) << valueContents(value); @@ -848,14 +849,14 @@ void QQmlEngineDebugServiceImpl::objectCreated(QJSEngine *engine, QObject *objec if (!m_engines.contains(engine)) return; - int engineId = QQmlDebugService::idForObject(engine); - int objectId = QQmlDebugService::idForObject(object); - int parentId = QQmlDebugService::idForObject(object->parent()); + qint32 engineId = QQmlDebugService::idForObject(engine); + qint32 objectId = QQmlDebugService::idForObject(object); + qint32 parentId = QQmlDebugService::idForObject(object->parent()); QQmlDebugPacket rs; //unique queryId -1 - rs << QByteArray("OBJECT_CREATED") << -1 << engineId << objectId << parentId; + rs << QByteArray("OBJECT_CREATED") << qint32(-1) << engineId << objectId << parentId; emit messageToClient(name(), rs.data()); } diff --git a/src/plugins/qmltooling/qmldbg_debugger/qqmlenginedebugservice.h b/src/plugins/qmltooling/qmldbg_debugger/qqmlenginedebugservice.h index c0c24058eb..741768cd00 100644 --- a/src/plugins/qmltooling/qmldbg_debugger/qqmlenginedebugservice.h +++ b/src/plugins/qmltooling/qmldbg_debugger/qqmlenginedebugservice.h @@ -111,7 +111,8 @@ private: friend class QQmlDebuggerServiceFactory; void processMessage(const QByteArray &msg); - void propertyChanged(int id, int objectId, const QMetaProperty &property, const QVariant &value); + void propertyChanged(qint32 id, qint32 objectId, const QMetaProperty &property, + const QVariant &value); void prepareDeferredObjects(QObject *); void buildObjectList(QDataStream &, QQmlContext *, -- cgit v1.2.3