QML ListModel和自定义函数属性

时间:2014-11-29 10:38:41

标签: qml qt5 qt5.2

我想编写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 ,它效果很好。 所以我的问题是如何在从模型调用时以格式或其他函数正常工作的方式填充模型?

2 个答案:

答案 0 :(得分:0)

试试这个

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

答案 1 :(得分:0)

对于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
    }
}

这样Item.format()应该调用&#34;返回val&#34;作为ColumnDescriptor的默认和&#34;!&#34; + val,因为ColumnDescriptor是从Item派生的。