[Interest] QQmlPropertyList x QList in hybrid C++/QML APIs

Alan Alpert 416365416c at gmail.com
Fri Jun 14 19:48:53 CEST 2013


To use types across QML/C++ you should use qmlRegisterType.
QObject-based types aren't automatically registered with QML, but
certain things may still work. element.ownedAttributes is undefined
because you haven't registered the type.

However you don't have to maintain two different classes. You can just
register the same C++ class into QML. To interact with the list
property properly (mostly just assigning to it in QML, i.e. UmlClass {
ownedOperations: [UmlOperation {}] } ) you need to have a
QQmlListProperty type property, not just the QList<QObject*> property.
But the QQmlListProperty type is basically just a wrapper around a
QList<QObject*> (providing better control of the allocation if you
need it), so it will be using the same QList<QObject*> as the data.
You just need the extra property, not duplicating or synchronizing
data, so it's easy to put it on the same C++ class and there's very
little more you have do to use it properly in QML.

--
Alan Alpert

On Fri, Jun 14, 2013 at 9:15 AM, Sandro Andrade <sandroandrade at kde.org> wrote:
> Hi there,
>
> I've a bunch of classes which define a number of Q_PROPERTies with
> type QList<some-QObject-based-class *>. Those classes are inspected by
> a generic widgets-based property editor which uses QMetaProperty
> functions to handle item's properties.
>
> E.g:
>
> class Q_UML_EXPORT QUmlClass : public QWrappedObject
> {
>     Q_OBJECT
>     Q_CLASSINFO("MetaModelPrefix", "QUml")
> ...
>     Q_PROPERTY(QList<QUmlOperation *> ownedOperations READ ownedOperations)
>     Q_PROPERTY(QList<QUmlProperty *> ownedAttributes READ ownedAttributes)
> ...
>
> Now, I need to use QML to provide some visual representation of those
> same elements and, therefore, QML objects should be dynamically
> created based on QList-based properties' contents:
>
> import QtQuick 2.0
>
> Rectangle {
> ...
>     UmlSlot {
>         id: nameSlot
>     }
>     UmlSlot {
>         id: propertiesSlot
>         anchors.top: nameSlot.bottom
>         anchors.topMargin: -1
>         height: nameSlot.height; width: nameSlot.width
>     }
> ...
>     Component.onCompleted: {
>         if (element) {
>             var visibility;
>             switch (element.visibility) {
>                 case 0: visibility = "+"; break;
>                 case 1: visibility = "-"; break;
>                 case 2: visibility = "#"; break;
>                 case 3: visibility = "~"; break;
>             }
>             name = visibility + element.objectName;
>             nameSlot.labelFont.italic = element.isAbstract; // Works
> fine so far ...
>             element.ownedAttributes <- here I got an undefined object
>         }
>     }
> }
>
> Qt5 docs say that such properties should be declared as
> QQmlListProperty, but I'm wondering if I have to maintain two
> different classes/properties in order to have this working. I haven't
> used qmlRegisterType() so far, it seems QObject-based type are
> automatically registered in QML as metatype registration do in Qt5.
>
> So, any hints on how to have such QML/C++ things living together ?
>
> Thanks in advance,
> --
> Sandro
> _______________________________________________
> Interest mailing list
> Interest at qt-project.org
> http://lists.qt-project.org/mailman/listinfo/interest



More information about the Interest mailing list