Зачем использовать QAbstractTableModel вместо QAbstractListModel?
Я реализовал TableView
в QML используя TableViewColumn
с такими ролями, как это:
TableView {
TableViewColumn {
role: "role1"
title: "Role1"
}
...
}
Он связан с моделью C++, унаследованной от QAbstractListModel
со всеми определенными ролями, и я нахожу это совершенно естественным.
Тем не менее, я узнал, что там также существует QAbstractTableModel
, что позволяет использовать индексы столбцов. Я понял, что мне следовало бы использовать его, но я предпочитаю роли индексам столбцов.
Может кто-нибудь объяснить, в чем преимущество использования QAbstractTableModel
?
1 ответ
Там нет ни одного, если вы используете Qt Widgets vs. Qt Quick.
Qt в целом имеет архитектуру Model/View, и эту архитектуру можно использовать либо с Qt Widgets, либо с Qt Quick. Это то же самое понятие в обоих, но классы Представления отличаются между двумя, особенно представлениями таблицы.
В виджетах Qt у вас есть QTableView, это представление ожидает, что данные модели будут размещены в таблице (т. Е. Строки и столбцы), и как таковой можно будет использовать подкласс QAbstractTableModel, чтобы предоставить ему эти данные.
Однако в Qt Quick тип TableView НЕ является однозначной копией класса QTableView. На самом деле он совершенно другой, и он ожидает, что данные в любой предоставленной ему модели будут размещены в списке (то есть в строках, но только в 1 столбце), а НЕ в таблице. Для получения таблицы, подобной организации данных, тип TableView использует роли в столбцах.
Таким образом, в виджетах Qt можно использовать класс QTableView и использовать подкласс QAbstractTableModel для предоставления ему данных в макете таблицы (строки и столбцы), но в Qt Quick используется тип TableView и используется подкласс QAbstractListModel для предоставления это данные в макете списка (строки и только 1 столбец), но вместо того, чтобы показывать только Qt::DisplayRole в каждой ячейке, можно объявить разные роли, которые будут использоваться в каждом столбце TableView.
Его не так много, как один имеет большее значение по сравнению с другим, просто один тип / класс View ожидает данные в другом формате, чем другой.
Если вы сидите и думаете, что Qt усложнил это, просто знайте, что табличное представление - странная утка; Если вы говорите о представлении списка, то класс QListView (Qt Widgets) и тип ListView (Qt Quick) на самом деле почти один в один, они могут использовать одну и ту же модель взаимозаменяемо. То есть вы можете поместить свою модель в общую библиотеку и использовать ее в приложении Qt Quick или Qt Widgets без изменений. Следует отметить, что то же самое может быть достигнуто для QTableView/TableView, но модель должна поддерживать оба ожидания, показывая данные как таблицу со строками и столбцами, так и список со строками и ролями.
Я надеюсь, что ответит на ваш вопрос.
До тех пор, пока в следующий раз не мыслим творчески и творчески