【问题标题】:Qml TableView - TableViewColumn - ListModel - access nested objectsQml TableView - TableViewColumn - ListModel - 访问嵌套对象
【发布时间】:2015-12-14 23:05:48
【问题描述】:

目前我和一些学生正在使用 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&lt;Object*&gt;Order 类有一个属性 customer

Q_PROPERTY(Customer* customer READ getCustomer NOTIFY customerChanged)

它又拥有一个名为name的属性。

我们想在TableView 中显示后一个属性,但不幸的是只有OrderorderId 属性有效。

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

【问题讨论】:

    标签: qt qml tableview qtquick2


    【解决方案1】:

    根据documentation,您可以直接将QList&lt;QObject*&gt; 用作视图的模型,而无需像以前那样手动复制数据。特别是:

    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 }
    

    ListView et similia 确实如此,但我不确定是否可以直接使用 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
    }
    

    这种方法的一个缺点是您应该为每一列实现一个委托。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-15
      • 1970-01-01
      • 2013-11-03
      • 1970-01-01
      • 2022-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多