2

我已经TableView在 QML 中使用TableViewColumns 实现了一些这样的角色:

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

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

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

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

4

1 回答 1

3

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

Qt 通常具有模型/视图架构 ,该架构可以与 Qt WidgetsQt Quick 一起使用。两者的概念相同,但两者的视图类不同,尤其是表视图。

在 Qt Widgets 你有QTableView,这个视图期望模型数据被布置在一个表中(即行和列),因此可以使用 QAbstractTableModel 的子类来提供这个数据。

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

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

与其说一个比另一个更有价值,不如说是一个视图类型/类期望数据的格式与另一种不同。

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

我希望回答你的问题。

直到下一次 富有想象力的思考和创造性的设计

于 2015-05-28T00:30:26.023 回答