【问题标题】:QML TableView: How do you only display a subset of model index data?QML TableView:如何只显示模型索引数据的子集?
【发布时间】:2021-01-09 11:20:23
【问题描述】:

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

我读过的所有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() 并将它们用作视图中的属性的情况下做到这一点?

【问题讨论】:

  • 这是一个概念问题,而不是一个可重现的问题。他们有什么特别不清楚的地方吗?
  • 不,这不仅是概念性的,因为您指出:但我只想显示一小组列。因此您的代码自角色以来就有错误“显示”应该涵盖您想要的内容,但您的模型似乎很奇特
  • 很难简化模型,因为 data() 函数是大约 300 行遗留代码。澄清更多:model.display 显示整个数据。他们是否可以在不使用自定义角色的情况下显示单个列(例如,model.display[2] 等)?

标签: c++ qt qml tableview


【解决方案1】:

据我所知,避免自定义角色的唯一方法是破解模型中的 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-10
    • 2022-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多