Qml TableView - TableViewColumn - ListModel - 访问嵌套对象
问题描述:
目前有些学生和我正在用QtQuick编写一个小应用程序。
我们有以下TableView
:Qml TableView - TableViewColumn - ListModel - 访问嵌套对象
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
内显示后面的属性,但不幸的是只有Order
的orderId
属性确实有效。
什么样的价值应该有第二个角色?我们如何访问嵌套对象的数据?
答
根据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
属性,就像您的情况一样,我们可以通过modelData
检索它,然后访问它的属性。所以,例如与customer
属性,我们将不得不委托是这样的:
Text { text: model.modelData.customer.name }
,而我不知道它可以直接与TableView
来完成这对于ListView
等similia如此。一种可能的解决方法是将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
}
这种方法的缺点是,你应该实现为每列一个代表。