我在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]找到了未定义的对象。
答案 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属性时,则不是这样。