Где мне взять логику адаптации данных на уровне делегата или на уровне модели?Qt: преобразование данных на раму модели/представления
С логика адаптации данных Я имею в виду, когда данные должны быть преобразованы при извлечении и записи. Например, в sqlite тип date
не существует, а QSqlTableModel
извлекает даты как строки (но это даты, просто это не отражается в типе столбца), в результате чего QStyledItemDelegate
показывает QLineEdit
при редактировании ,
Чтобы изменить его в качестве даты, вы можете сделать две вещи:
установкой пользовательский делегат, который преобразует
QVariant
строку вQVariant
дату, а также создаетQDateEdit
(и обратное преобразование при сохранении изданий).выведение
QSqlTableModel
сделать то же преобразование для соответствующих столбцов, без необходимости установки какого-либо пользовательского делегата (QStyledItemDelegate
распознаетQVariant
типа даты и показатьQDateEdit
автоматически).
Что я должен делать, или что такое «стандартный» или обычный способ сделать это в Qt?
Плюсы и минусы:
- В делегате подходе модель нетронутые.
- В модельном подходе вид нетронутый (для него не требуется получение представления).
- Любой вид с использованием модели должен установить тот же пользовательский делегат для соответствующих столбцов. На модельном подходе каждый вид видит изменения без установки какого-либо делегата, который, я думаю, имеет наилучший пункт, на мой взгляд, поскольку модели считаются общими, но взглядов нет.
- Один и тот же класс делегата может использоваться и для заголовков. В модельном подходе вы должны получить методы
headerData
s иdata
s, если вы хотите сделать любое преобразование по ним. - В отношении делегата, если вы хотите изменить модель представления, вам необходимо удалить ранее установленные делегаты, что вынуждает вас синхронизировать делегаты с моделями (делегат привязан к определенному столбцу конкретной модели таблицы).
Я бы сделал это на уровне модели. Если вы не хотите прикасаться к модели, вы можете использовать 'QIdentityProxyModel' для преобразования данных. –