Зачем использовать 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, но модель должна поддерживать оба ожидания, показывая данные как таблицу со строками и столбцами, так и список со строками и ролями.

Я надеюсь, что ответит на ваш вопрос.

До тех пор, пока в следующий раз не мыслим творчески и творчески

Другие вопросы по тегам