【发布时间】:2021-01-09 11:20:23
【问题描述】:
我想在新的 QML TableView 中显示来自大型现有 C++ TableModel 的列子集。
我读过的所有documenation 和示例都会覆盖QAbstractItemModel::roleNames(),以将与角色关联的模型数据作为QML 中的属性公开。
问题在于旧版TableModel 的data() 函数具有与Qt::DisplayRole 紧密耦合的复杂实现:
\\...
QVariant LegacyModel::data(const QModelIndex& index, int role) {
switch(role) {
\\...
case Qt::DisplayRole:
switch(LegacyTableColumn.at(index.column())) {
\\ lots of stuff
}
}
\\...
}
\\...
因此,我宁愿避免覆盖 QAbstractItemModel::roleNames(),因为这将意味着对上述 data() 函数进行大量重构。
我有一个 QML 视图,显示 所有每个模型行中的列:
TableView {
anchors.fill: parent
model: LegacyModel
delegate: RowLayout {
implicitWidth: parent.width
Text {
text: model.display // i.e., inferred from Qt::DisplayRole
// can I access column data here somehow?
}
}
}
但我只想显示一小组列。
有没有办法在不覆盖 roleNames() 并将它们用作视图中的属性的情况下做到这一点?
【问题讨论】:
-
这是一个概念问题,而不是一个可重现的问题。他们有什么特别不清楚的地方吗?
-
不,这不仅是概念性的,因为您指出:但我只想显示一小组列。因此您的代码自角色以来就有错误“显示”应该涵盖您想要的内容,但您的模型似乎很奇特
-
很难简化模型,因为
data()函数是大约 300 行遗留代码。澄清更多:model.display显示整个行数据。他们是否可以在不使用自定义角色的情况下显示单个列(例如,model.display[2]等)?