为什么使用QAbstractTableModel而不是QAbstractListModel?

时间:2015-05-25 11:01:33

标签: qml qtquick2 datamodel qabstracttablemodel qabstractlistmodel

我已使用TableView在QML中实现TableViewColumn,其中包含以下某些角色:

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

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

但是,我发现还存在QAbstractTableModel,它允许使用列索引。我知道我应该使用它,但我更喜欢角色到列索引

有人可以解释一下使用QAbstractTableModel的优势吗?

1 个答案:

答案 0 :(得分:3)

除非你使用Qt Widgets和Qt Quick,否则没有一个。

Qt通常有一个Model/View architecture,这个架构既可以用于Qt Widgets ,也可以用于 Qt Quick。两者中的概念相同,但View类在两者之间是不同的,尤其是表视图。

在Qt Widgets中你有QTableView,这个视图需要将模型数据放在一个表中(即行和列),因此可以使用QAbstractTableModel的子类来为它提供这个数据

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

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

它不是因为一个人拥有更多的价值而只是一个View类型/类要求数据采用不同的格式而不是另一个。

如果你坐在那里认为Qt已经让这种不必要的复杂化,只知道桌面视图是奇怪的鸭子;如果你在谈论列表视图,QListView(Qt Widgets)类和ListView(Qt Quick)类型实际上几乎是一对一的行为,它们都可以使用相同的模型interchangabley。也就是说,您可以将模型放在共享库中,并在Qt Quick或Qt Widgets应用程序中使用它而不进行任何修改。应该注意的是,QTableView / TableView可以获得同样的效果,但模型必须支持这两种期望,将数据显示为包含行和列的表以及包含行和角色的列表。

我希望你提出问题。

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