为什么使用 QAbstractTableModel 而不是 QAbstractListModel?

Why using QAbstractTableModel instead of QAbstractListModel?

我已经在 QML 中使用 TableViewColumn 实现了 TableView,其中一些角色如下:

TableView {
    TableViewColumn {
        role: "role1"
        title: "Role1"
    }
    ...
}

它绑定到 C++ 模型,继承自 QAbstractListModel 并定义了所有角色,我发现它非常自然。

但是,我发现还存在 QAbstractTableModel,它允许使用列索引。我知道我可能应该使用它,但我更喜欢 roles 而不是列索引 .

有人可以解释一下使用 QAbstractTableModel 有什么好处吗?

除非您使用 Qt Widgets 与 Qt Quick,否则没有。

Qt 通常有一个 Model/View architecture 并且该架构可以与 Qt Widgets Qt Quick 一起使用。两者的概念相同,但两者的视图 class 不同,尤其是 table 视图。

在 Qt Widgets 中,您有 QTableView,此视图期望模型数据以 table(即行和列)布局,因此将使用子 [= QAbstractTableModel 的 46=] 为其提供此数据。

但在 Qt Quick 中,TableView 类型是 NOT QTableView 的一对一副本 class。事实上,它完全不同,它希望提供给它的任何模型中的数据都放在列表中(即行但只有 1 列)NOT一个table。为了实现 table 类似的数据排列,TableView 类型在列的颜色中使用角色。

因此,在 Qt Widgets 中,可以使用 QTableView class 并使用 QAbstractTableModel 的子 class 以 table 布局(行和列)向其提供数据,但在Qt Quick 使用 TableView 类型并使用 QAbstractListModel 的子 class 以列表布局(行和仅 1 列)提供数据,而不是仅在每个单元格中显示 Qt::DisplayRole声明要在 TableView 的每一列中使用的不同角色。

与其说一个比另一个更有价值,还不如说一个视图 type/class 期望数据采用与另一个不同的格式。

如果你坐在那里认为 Qt 已经把这个不必要地复杂化了,那就知道 table 视图是奇怪的鸭子;如果您谈论的是列表视图,QListView (Qt Widgets) class 和 ListView (Qt Quick) 类型实际上在行为上几乎是一对一的,它们都可以使用相同的模型互换。也就是说,您可以将您的模型放在一个共享库中,并在 Qt Quick 或 Qt Widgets 应用程序中使用它而无需修改。应该注意的是,QTableView/TableView 也可以实现相同的效果,但模型必须支持这两种期望,将数据显示为具有行和列的 table 以及具有行和角色的列表。

希望能回答您的问题。

留待下次发挥想象力和创造性设计