QML TableView:如何只显示模型索引数据的一个子集?

QML TableView: How do you only display a subset of model index data?

我想在新的 QML TableView 中显示来自大型现有 C++ TableModel 的列子集 TableView

我阅读的所有 documenation 和示例覆盖 QAbstractItemModel::roleNames() 以将与角色关联的模型数据公开为 QML 中的属性。

问题在于遗留 TableModeldata() 函数具有与 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