QML TableView:如何只显示模型索引数据的一个子集?
QML TableView: How do you only display a subset of model index data?
我想在新的 QML TableView
中显示来自大型现有 C++ TableModel
的列子集 TableView
。
我阅读的所有 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()
并将它们用作视图中的属性的情况下做到这一点?
据我所知,避免自定义角色的唯一方法似乎是破解模型中的 Q_INVOKABLE
函数:
// LegacyModel.h:
...
Q_INVOKABLE QVariant getMyData(int row, int column) const { return m_data[row][column]; }
...
// TableView.qml:
TableView {
...
model: LegacyModel
delegate: RowLayout {
...
Text {
text: model.getMyData(row, 2)
}
Text {
text: model.getMyData(row, 5)
}
// etc.
}
}
这不是一个很好的解决方案,所以我将创建一个新模型,其中包含自定义角色。
相关:
How to implement QML ListModel like get method for an QAbstractListModel derived model
How to access ListView's current item from qml
How to access Items stored in a QAbstractListmodel in QML(by delegates) otherwise than using item roles?
QML Model data by index
我想在新的 QML TableView
中显示来自大型现有 C++ TableModel
的列子集 TableView
。
我阅读的所有 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()
并将它们用作视图中的属性的情况下做到这一点?
据我所知,避免自定义角色的唯一方法似乎是破解模型中的 Q_INVOKABLE
函数:
// LegacyModel.h:
...
Q_INVOKABLE QVariant getMyData(int row, int column) const { return m_data[row][column]; }
...
// TableView.qml:
TableView {
...
model: LegacyModel
delegate: RowLayout {
...
Text {
text: model.getMyData(row, 2)
}
Text {
text: model.getMyData(row, 5)
}
// etc.
}
}
这不是一个很好的解决方案,所以我将创建一个新模型,其中包含自定义角色。
相关:
How to implement QML ListModel like get method for an QAbstractListModel derived model
How to access ListView's current item from qml
How to access Items stored in a QAbstractListmodel in QML(by delegates) otherwise than using item roles?
QML Model data by index