我必须在qml中使用某种c ++ qt模型。我已经有了QStandardItemModel,但由于所谓的setRoleNames(),它在QML中不起作用。我一直在寻找角色的一些解释,但我似乎无法找到。我在qml(here)中找到了使用QStandardItemMOdel的某种解决方案,但是它使用了“角色”,所以我不明白它是如何工作的。
qt模型中的角色是什么?
答案 0 :(得分:8)
角色只是访问模型数据时使用的附加选择器。这取决于模型和关于如何具体解释角色的观点。当您使用模型时,您必须确定使用哪些角色来记住模型的行为。这些角色允许您将各种属性附加到每个数据项。
让我们看一个具体的例子。 QStringListModel
会忽略除EditRole
和DisplayRole
之外的所有角色。如果使用任何其他角色,则忽略数据访问操作。您可以使用任一角色设置字符串,并且dataChanged()
信号将指示使用的角色。您可以使用任一角色访问该字符串。这是设计使用,可用于打破绑定链。
角色的名称作为模型的属性公开。例如。如果要将委托中的TextEdit
绑定到模型,可以执行以下操作:
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
}
}
Qt提供的C ++项目模型按名称定义显示和编辑角色。如果您有自定义模型并想要提供其他名称,那么在Qt 5中您应该重新实现QAbstractItemModel::roleNames()
以返回哈希值。当然,所述哈希应包含display
和edit
角色!在Qt 4中,您需要使用setRoleNames()
,因为roleNames()
不是虚拟的。
我在another answer中提供了一个完整的示例。