目前有些学生和我正在用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}}属性才有效。
第二个角色应该有什么价值?我们如何访问嵌套对象的数据?
答案 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
这种方法的缺点是你应该为每一列实现一个委托。