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

3

目前我和一些学生正在使用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中显示后者属性,但不幸的是只有OrderorderId属性起作用。

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

1个回答

2
根据文档,你可以直接使用QList<QObject*>作为视图的模型,而无需手动复制数据。特别地,

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

考虑到文档中链接的示例,我们可以将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属性,例如在您的情况下,我们可以通过modelData检索它,然后访问其属性。因此,例如对于customer属性,在委托中我们会有如下代码:

Text { text: model.modelData.customer.name }

这对于ListView等类似的内容是正确的,但我不确定是否可以直接使用TableView来实现。一种可能的解决方法是将QObject派生的角色与styleData.value的使用相结合。您可以在role属性中定义角色的使用,并在styleData.value内部访问内部属性。对于您的情况,解决方案如下(假设myModel是上面示例中的上下文属性):
TableView  {
    width: 100; height: 100

    model: myModel

    TableViewColumn {
        role: "customer"
        title: "Kunde"
        width: 100

        delegate: Text {
            text: styleData.value.name  // accessing the property
        }
    }

    itemDelegate: Item {   }            // should be set to empty to avoid warnings
}

这种方法的缺点是您需要为每一列实现一个代理。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接