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

问题描述:

目前有些学生和我正在用QtQuick编写一个小应用程序。
我们有以下TableViewQml 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内显示后面的属性,但不幸的是只有OrderorderId属性确实有效。

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

根据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 
} 

这种方法的缺点是,你应该实现为每列一个代表。