qt 模型中的角色是什么以及 setRoleNames() 的作用是什么?

问题描述 投票:0回答:2

我必须在 qml 中使用某种 c++ qt 模型。我已经有了 QStandardItemModel,但由于所谓的 setRoleNames(),它在 QML 中不起作用。我一直在寻找角色的一些解释,但似乎找不到。我找到了在 qml 中使用 QStandardItemMOdel 的某种解决方案(here),但它使用“角色”,所以我不明白它是如何工作的。

qt 模型中的角色是什么?

c++ qt qml roles
2个回答
11
投票

角色只是访问模型数据时使用的附加选择器。具体如何解释角色取决于模型和视图。当您使用模型时,您必须决定使用哪些角色,同时牢记模型的行为。这些角色允许您将各种属性附加到每个数据项。

让我们看一个具体的例子。

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()
不是虚拟的。

我在另一个答案中提供了完整的示例。


0
投票

我自己找到了答案

  1. 必须重载模型的角色名称:
 def roleNames(self):
        res = super().roleNames()
        res[2] = PySide6.QtCore.QByteArray('edit'.encode())
  1. 必须在 QML 模板中的 onEditingFinished 上更改“编辑”属性而不是“显示”
 onEditingFinished: {
                        edit = text
                    }
© www.soinside.com 2019 - 2024. All rights reserved.