2015-12-14 140 views
1

目前有些學生和我正在用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屬性確實有效。

什麼樣的價值應該有第二個角色?我們如何訪問嵌套對象的數據?

回答

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屬性,就像您的情況一樣,我們可以通過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 
} 

這種方法的缺點是,你應該實現爲每列一個代表。