Qml TableView - TableViewColumn - ListModel - 访问嵌套对象

时间:2015-12-14 23:05:49

标签: qt qml tableview qtquick2

目前有些学生和我正在用QtQuick编写一个小应用程序。
我们有以下TableView

TableView {
    model: ListModel {
        id: orderListModel
        Component.onCompleted: {
            var tOrderList = orderController.getOrderList();
            for(var i = 0; i < tTicketList.length; ++i){
                orderListModel.append(tOrderList[i]);
            }
        }
    }


    TableViewColumn {
        role: "orderId"
        title: "Auftragsnummer"
        width: 100
    }
    TableViewColumn {
        role: "customer.name"
        title: "Kunde"
        width: 100
    }
}

getOrderList会返回包含所有订单的QList<Object*>Order类具有属性customer

Q_PROPERTY(Customer* customer READ getCustomer NOTIFY customerChanged)

反过来又有一个名为name的属性。

我们希望在TableView中显示后一个属性,但遗憾的是只有orderId的{​​{1}}属性才有效。

第二个角色应该有什么价值?我们如何访问嵌套对象的数据?

1 个答案:

答案 0 :(得分:1)

根据documentation,您可以直接使用QList<QObject*>作为视图模型,而无需像手动那样手动复制数据。特别是:

  

QObject *可用作modelData属性。为方便起见,对象的属性也可以在委托的上下文中直接使用

考虑到文档中链接的the example,我们认为QObject的属性可以通过以下方式用作角色:

ListView {
    width: 100; height: 100

    model: myModel                     // injected QList<QObject*> context property
    delegate: Rectangle {
        height: 25
        width: 100
        color: model.modelData.color   // without "modelData" it would not work
        Text { text: name }
    }
}

这同样适用于嵌套属性。如果我们的QObject派生对象具有QObject属性,就像您的情况一样,我们可以通过{{1}检索它然后访问它的属性。因此,例如使用modelData属性,我们在委托中会有类似的内容:

customer

Text { text: model.modelData.customer.name } et similia也是如此,但我不确定是否可以直接使用ListView完成。一种可能的解决方法是将TableView派生角色的使用与QObject结合使用。您可以在styleData.value属性中定义角色的用法,并访问role内的内部属性。您的案例的解决方案如下所示(假设styleData.value是上下文属性,如上例所示):

myModel

这种方法的缺点是你应该为每一列实现一个委托。