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);
    }
}

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

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

调用格式示例:

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

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

4

2 回答 2

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() 应该调用“return val”作为默认值,并且 ColumnDescriptor 调用“!”+val,因为 ColumnDescriptor 是从 Item 派生的。

于 2016-12-07T11:58:15.333 回答
-1

尝试这个

Repeater {
    model: columnModel
    Text {
        text: columnModel[index].format([SOME USEFUL DATA])
    }
}
于 2014-11-29T14:26:35.527 回答