QQmlListProperty转换为不透明的QVariant

时间:2019-01-05 14:06:43

标签: c++ qt qml qt5

我在QQmlListProperty上遇到问题。

我的班级返回QQmlListProperty列表。我在c ++类的qml中调用一个函数,该函数返回相应的列表。 但是当我尝试访问列表时,例如 list.lenght ,我得到了一个未定义的javascript对象。

C ++侧面

class IControllerInterface {
...
public:
    QQmlListProperty<IObject> objectsQml() {
        return QQmlListProperty<IObject>(this,
                                         this,
                                         &IController::qmlListAppend,
                                         &IController::qmlListCount,
                                         &IController::qmlListAt,
                                         &IController::qmlListClear);
    }

    private:
        static void qmlListAppend(QQmlListProperty<IObject> *list, IObject *object);
        static IObject *qmlListAt(QQmlListProperty<IObject> *list, int index);
        static int qmlListCount(QQmlListProperty<IObject> *list);
        static void qmlListClear(QQmlListProperty<IObject> *list);
...
}

void IController::qmlListAppend(QQmlListProperty<IObject> *list, IObject *object)
{

}

IObject *IController::qmlListAt(QQmlListProperty<IObject> *list, int index)
{
    return reinterpret_cast< IController* >(list->data)->objects()[index];
}

int IController::qmlListCount(QQmlListProperty<IObject> *list)
{
    return reinterpret_cast< IController* >(list->data)->objects().size();
}

void IController::qmlListClear(QQmlListProperty<IObject> *list)
{

}

...

class RestAPI {

...

    Q_INVOKABLE QQmlListProperty<IObject> lookupObjectsQml(const IObject::ObjectType type) {
        Q_D(RestAPI);
        return d->getController(type)->objectsQml();
    }

...

}

*注意:RestAPI是一个单例类

QML SIDE

RestControl {
        id: ctrl

        Component.onCompleted: {
            var lst = RestAPI.lookupObjectsQml(IObject.FARM)
            console.log(lst)
            console.log('found ' + lst.length + ' objects..')
            for(var obj in lst) {
                console.log(obj.id)
            }
        }
}

当我调用 RestAPI.lookupObjectsQml(IObject.FARM) 并将结果分配给变量 lst ..我收到一个不透明的qvariant对象:

QVariant(QQmlListProperty)

这样我就无法访问我的IObjects *。

例如,此调用将返回未定义的: lst.length

我做错了什么?

  

调试05-01-19 10:42:49:889 [GUI] [root] QVariant(QQmlListProperty)

     

DEBUG 05-01-19 10:42:49:890 [GUI] [root]找到了未定义的对象。

1 个答案:

答案 0 :(得分:0)

QQmlListProperty类型应该作为属性本身公开给QML:

Q_PROPERTY(QQmlListProperty<IObject> objects READ objects)

为了正确使用此类型,您的QML代码中的JavaScript语义应类似于:

RestAPI.lookupObjectsQml(IObject.FARM);
for(var obj in RestAPI.objects) {
   console.log(obj.id)
}

其余的代码显示,您将能够使用C ++完成此类更改。但是当然,您可以找到许多其他方法[instance] ,以根据需要提供函数调用中的对象列表,但是当QQmlListProperty完全用作QML属性时,则不是这样。