【问题标题】:QML ListModel and custom function propertyQML ListModel 和自定义函数属性
【发布时间】:2014-11-29 10:38:40
【问题描述】:

我想编写 TableView 的优化版本(Qt 包中的 TableView.qml)。 我有 ColumnDescriptor.qml 与列定义:

Item {
    property string title
    property var formatDelegate: null

    .... (other property definition)

    function format(val) {
        if (formatDelegate != null)
            return formatDelegate(val);
        else
            return val;
    }
}

上面的代码定义了一组属性和函数format(val),如果设置了formatDelefate,则调用格式值。

在主表中,我使用 list 来存储预定义的列定义(临时)和 ListModel 来存储最终的列定义(后者比 list 更有用 在剩余的实现中)

列表示例:

 property list<ColumnDescriptor> colDefines: [
    ColumnDescriptor { 
        title: qsTr("col1")  
    },
    ColumnDescriptor { 
        title: qsTr("col2")
        formatDelegate: function(val) { return "!" + val}
    }
]

填充ListModel (id: columnModel):

Component.onCompleted: {
    for(var i = 0; i < colDefines.length; ++i)
    {
        var col = colDefines[i];
        ...(some calculation)
        columnModel.append(col);
    }
}

一切看起来都很好,但是当我尝试从模型项调用 format 时,Qt 向我发送以下错误

Property 'format' of object QQmlDMListAccessorData(0x8e3bf78) is not a function

调用示例格式

Repeater {
    model: columnModel
    Text {
        text: model.format([SOME USEFUL DATA])
    }
}

另一方面,如果我直接从 list 调用 format 效果很好。 所以我的问题是如何以 format 或其他函数在从模型调用时正常工作的方式填充模型?

【问题讨论】:

  • 这对我来说几乎是个谜,我不明白为什么在 QML 中从列表中取回数据如此困难。但是,您可能会发现这很有用(我确实如此):stackoverflow.com/a/5239864/1858225

标签: qml qt5 qt5.2


【解决方案1】:

对于 QtQuick2 这应该可以工作

formatDelegate = [function(val) { return "!" + val}]
formatDelegate[0]("some text")

但您也可以使用覆盖技术:

Item {
    function formatDelegate(val) {
       return val;
    }

    function format(val) {
       return formatDelegate(val);
    }
}
ColumnDescriptor { 
    function formatDelegate(val) {
       return "!" + val
    }
}

鉴于 ColumnDescriptor 是从 Item 派生的,因此 Item.format() 应该调用“return val”作为默认值,并为 ColumnDescriptor 调用“!”+val。

【讨论】:

    【解决方案2】:

    试试这个

    Repeater {
        model: columnModel
        Text {
            text: columnModel[index].format([SOME USEFUL DATA])
        }
    }
    

    【讨论】:

    • 早点试过,今天重试 - 不工作(同样的错误)
    猜你喜欢
    • 1970-01-01
    • 2023-03-13
    • 2017-10-06
    • 1970-01-01
    • 2012-05-13
    • 1970-01-01
    • 1970-01-01
    • 2017-08-13
    • 1970-01-01
    相关资源
    最近更新 更多