QList<int> 不能用作Repeater 的模型

Posted

技术标签:

【中文标题】QList<int> 不能用作Repeater 的模型【英文标题】:QList<int> cannot be used as a model for Repeater 【发布时间】:2015-08-13 19:12:45 【问题描述】:

我有一个QObject 属性声明为:

Q_PROPERTY( QList< int > keys READ getKeys NOTIFY keysChanged )

在docs 中声明:

某些 C++ 序列类型在 QML 中被透明地支持为 javascript 数组类型。

具体来说,QML 目前支持:

QList

...

但是,当我使用此属性驱动 Repeater 模型时:

QtObject 
    id: d_
    property var keys: base.proxy.keys // A binding to the C++ keys property
    onKeysChanged: 
        ...
    


Column 
    spacing: 4

    Repeater 
        id: repeater
        model: d_.keys
        delegate: Rectangle 
            height: 24
            width: 24
            color: "red"
        
    

Repeater 模型不产生委托。如果我查询 d_.keys 的长度,它会显示正确的数量,如果我从 C++ 更改属性,则会触发 d_.onKeyChanged: — 但 Repeater 不会构建任何东西。

如果我将 QML keys 属性更改为 JS 数组:

property var keys: [1,2,3]

Repeater 按预期工作。如果我使用 C++ 属性,但手动将数据转换为 JS 数组,它也可以按预期工作:

QtObject 
    id: d_
    property var keys: base.proxy.keys

    onKeysChanged: 
        var list = [];
        for ( var i = 0; i < keys.length; ++i ) 
            list.push( keys[i] );
        
        repeater.model = list;
    

这强烈表明,不管文档怎么说,QList&lt;int&gt; 等同于 JS 数组。是我做错了什么,还是这是一个错误?

【问题讨论】:

我知道这根本不能解决问题,但是您是否尝试过使用填充整数的QVariantList 这实际上是一个好点。 QList&lt;int&gt; 属性似乎(直接)不适用于 Repeater 模型,但 JS 数组可以。另一种方法是使用base.proxy.keys.length 来控制应该始终有效的模型。我同意你的说法,QList&lt;int&gt; 不等同于 JS 数组。 您链接到的文档不是关于模型的,它们只是声明这些 C++ 类型“在 QML 中作为 JavaScript 数组类型被透明地支持”。 This 文档是,并且没有将 QList&lt;int&gt; 列为有效模型。 @Mitch 啊,好点子,感谢您提交错误报告。尽管您链接到的页面不应该也指定QVariantList 可以用作QML 模型吗?因为这对我有用。 bugreports.qt.io/browse/QTBUG-47768 :p 【参考方案1】:

如here 所述,QVariantList 被转换为 JS 数组,因此问题可能是内容的类型而不是列表本身。

也就是说,我同意您的观点,即文档不够清晰,因为 QList 似乎也是一个有效的替代方案。

【讨论】:

虽然 OP 链接的文档与 C++ 模型无关,但它们只是声明这些 C++ 类型“在 QML 中作为 JavaScript 数组类型被透明地支持”。 This 文档是,并且没有将 QList&lt;int&gt; 列为有效模型。但是,是的,如果是这种情况,文档应该说明它们不适合用作模型。

以上是关于QList<int> 不能用作Repeater 的模型的主要内容,如果未能解决你的问题,请参考以下文章

qlist<qvariant>怎么转换成 int

使用 QHash 和 QList 提高性能

如何清理复杂的 QList?

QList

为啥我打印的值超出范围?

qt 5中qlist