2013-09-05 90 views
4

我必須在qml中使用某種C++ qt模型。我已經有了QStandardItemModel,但由於所謂的setRoleNames(),它在QML中不起作用。我一直在尋找一些角色的解釋,但我似乎無法找到。我發現在qml中使用QStandardItemMOdel的一些解決方案(here),但它使用「角色」,所以我不明白它是如何工作的。什麼是qt模型中的角色和setRoleNames()是做什麼的?

什麼是qt模型中的角色?

回答

4

角色只是訪問模型數據時使用的附加選擇器。這取決於具體解釋角色的模型和觀點。當你使用模型時,你必須決定使用哪些角色來保持模型的行爲。角色使您可以將各種屬性附加到每個數據項。

我們來看一個具體的例子。 QStringListModel忽略所有角色,但是EditRoleDisplayRole。如果您使用其他角色,則數據訪問操作將被忽略。您可以使用任一角色設置字符串,並且使用的角色將由dataChanged()信號指示。您可以使用任一角色訪問該字符串。這是通過設計,旨在打破捆綁鏈。

角色的名稱作爲模型的屬性公開。例如。如果你想在一個委託一個TextEdit綁定到模型中,你可以做如下:Qt提供

delegate: Component { 
    TextInput { 
     id: editor 
     text: edit // show the "edit" role of the model, to break the binding loop 
     onTextChanged: model.display = text // set the display role of the model 
    } 
} 

的C++項目模型定義的顯示和名稱編輯的角色。如果你有一個自定義模型並想提供其他名字,在Qt 5中你應該重新實現QAbstractItemModel::roleNames()來返回一個散列。當然,所述散列應該包含displayedit角色!在Qt 4中,您需要使用setRoleNames(),因爲roleNames()不是虛擬的。

我在another answer中提供了一個完整的示例。