如何在循环中初始化 qml 属性列表?

Posted

技术标签:

【中文标题】如何在循环中初始化 qml 属性列表?【英文标题】:How to initialize qml property list in a loop? 【发布时间】:2015-10-31 08:57:15 【问题描述】:

我有 qml list 属性:

Item 
    property list<SomeItem> items: [
        SomeItem  num: 0 ,
        SomeItem  num: 1 ,
        SomeItem  num: 2 ,
        ...
        SomeItem  num: 100 
    ]

是否有可能以更聪明的方式初始化它?例如。以某种方式类似于下面的代码?

Item 
    property list<SomeItem> items

    ...

    Component.onCompleted: 
        for(var i = 0; i < 100; i++)
            ??? // items.append( SomeItem num: i)
    

编辑:对不起 id,我实际上想更改用于初始化其他属性的自定义属性 (num):

SomeItem 
    property int num: 0

    key: getKey(num)
    name: getName(num)

    function getKey(num) 
        return ...
    

    function getName(num) 
        return ...
    

EDIT 2(根据 Mitchddriver 的回答): 我想使用Repeater,但是我必须初始化一些外部库提供的列表属性。

我一直在用num 属性初始化SomeItem,因为key 属性必须是唯一的并且不能为空。但是,假设我可以通过在 onCompleted 方法中设置 num 来应对它:

Item 
    property list<SomeItem> items: [
        SomeItem  ,
        SomeItem  ,
        SomeItem  ,
        ...
        SomeItem  
    ]

    ...

    Component.onCompleted: 
        for(var i = 0; i < items.length; i++)
            items[i].num = i
    

所以主要问题是我必须添加 SomeItem , 行 100 次。有没有什么巧妙的方法来动态创建这样的属性列表?

【问题讨论】:

老实说,第一个对我来说很聪明,并且最接近 QML 的底层范式。 @skypjack - 这绝对不聪明,而且绝对是多余的。 好吧,如果他关心ids,那确实是正确的方法。问题可能在于他不应该关心他们的情况,但从例子中我不能这么说。 @skypjack - 不,这是错误的。在语法和概念上。 随你喜欢,伙计。如果你有办法动态分配ids,请回答这个问题,我也很好奇,我一定会投赞成票。 【参考方案1】:

没有。

documentation for list 描述了它的使用方式:

可以通过类似于 javascript 数组的方式访问列表值:

使用带有逗号分隔值的 [] 方括号语法分配值 length 属性提供列表中的项目数 使用 [index] 语法访问列表中的值

你最好使用Repeater

Repeater 
    model: 100

    delegate: SomeItem 
        num: index
    

【讨论】:

【参考方案2】:

您尝试做的事情毫无意义。并且是完全多余的。而且不可能。

id 属性不是字符串,也不能是数字。

在您的特定情况下,您需要一个等于列表中每个对象索引的数字 id,除了不可能之外,这也是不必要的。相反,您可以使用items[index] 轻松访问每个对象。

如果由于某种原因你真的需要分配和使用动态标识符,你可以使用一个 JS 对象,它允许你进行字符串键查找而不是整数索引:

    Item         
        property var lookup: new Object

        Component 
            id: test

            QtObject 
                property string name
            
        

        Component.onCompleted: 
            lookup["John"] = test.createObject(null,  "name" : "JohnDoe" )
            lookup["Jane"] = test.createObject(null,  "name" : "JaneDoe" )

            console.log(lookup["John"].name) // outputs JohnDoe
            console.log(lookup["Jane"].name) // outputs JaneDoe
        
    

【讨论】:

当且仅当ids 不是要求时才有效(当然,在查看问题时这是有意义的,但问题中没有说明,它可能是该示例是ids 很重要的更复杂情况的简化示例)。编辑:问题刚刚更新,所以这是有道理的。

以上是关于如何在循环中初始化 qml 属性列表?的主要内容,如果未能解决你的问题,请参考以下文章

如何将具有自定义属性的组件移动到 QML 中的单独文件

如何将对话框锚定到listview qt qml中的按钮

如何在 QML 的列表中直接声明项目?

在 C++ 中循环读取 QML 对象(CheckBox)属性:总是相同的值

如何导出 qmlitem 的所有属性/信号?

如何在 QML 中编辑 QQmlListProperty