[Interest] [Qt3D] Mixing C++ and QML

Sean Harmer sean.harmer at kdab.com
Thu Oct 19 18:06:51 CEST 2017


Hi,

you've hit one of the issues we did with exposing C++ and QML APIs. 
Namely, QQmlListProperty. This thing should ideally never have existed 
and instead support for properties of collections should have been added 
to QObject and the metaobject system.

To avoid pulling in a QtQml dependency in the C++ API, we instead have 
another layer to add the QML specifics (pretty much entirely list 
properties).

In order to create these from code we have a factory. Try something like:

QAbstractNodeFactory::createNode<QEntity>("QEntity")

If using just C++ you will get a standard QEntity. If using QML (and the 
types are registered with the factory) you will get the QML -enhanced 
version with the extension object that handles the list properties.

We use this for e.g. in the renderer's SkeletonLoader class to create 
QJoints for the frontend tree.

Cheers,

Sean

On 19/10/2017 16:40, Xavier Bigand wrote:
> The issue is that QEntity doesn't reflect directly the qml type Entity,
> this is the same for many Qt3D classes.
>
> Here is the declaration of QEntity from qentity.h
>
> class QT3DCORESHARED_EXPORT QEntity : public QNode
>
> {
>
> Q_OBJECT
>
> public:
>
> explicit QEntity(QNode *parent = nullptr);
>
> virtual ~QEntity();
>
>
> QComponentVector components() const;
>
>
> void addComponent(QComponent *comp);
>
> void removeComponent(QComponent *comp);
>
>
> QEntity *parentEntity() const;
>
>
> protected:
>
> explicit QEntity(QEntityPrivate &dd, QNode *parent = nullptr);
>
>
> private:
>
> Q_DECLARE_PRIVATE(QEntity)
>
>
> QNodeCreatedChangeBasePtr createNodeCreationChange() const Q_DECL_OVERRIDE;
>
> };
>
>
>
> As you can see the method addComponent is not virtual and exported as Q_PROPERTY, so when creating a derived class of QEntity when instanced in qml it doesn't inherited of Entity properties.
>
>
>
>
> 2017-10-19 15:44 GMT+02:00 Jason H <jhihn at gmx.com <mailto:jhihn at gmx.com>>:
>
>     > I am looking for a way to manage an Entity tree in C++ and the Scene configuration in QML. My C++ code manage entities from a root node and I want to move the Frame graph and camera management,... to qml.
>     > I can't figure out how to do that because if create a class that derive from QEntity some properties of Entity aren't declared like "components".
>     >
>     > My goal is to have an object hierarchy made with QEntity in c++ and dynamic views on it made in QML. Scene views should be dockable,...
>
>
>     This is well-documented. QEntity inherits from QObject so you are
>     good. I'm not sure what you mean by "like components". Public
>     properties, signals and slots are visible to QML. If not it's a
>     simple matter of wrapping them in a public one.
>
>     http://doc.qt.io/qt-5/qtqml-cppintegration-topic.html
>     <http://doc.qt.io/qt-5/qtqml-cppintegration-topic.html>
>
>
>
>
>
>
> --
> Xavier
>
>
> _______________________________________________
> Interest mailing list
> Interest at qt-project.org
> http://lists.qt-project.org/mailman/listinfo/interest
>

-- 
Dr Sean Harmer | sean.harmer at kdab.com | Managing Director UK
KDAB (UK) Ltd, a KDAB Group company
Tel. +44 (0)1625 809908; Sweden (HQ) +46-563-540090
Mobile: +44 (0)7545 140604
KDAB - Qt Experts



More information about the Interest mailing list