2016-12-03 5 views
1

Где мне взять логику адаптации данных на уровне делегата или на уровне модели?Qt: преобразование данных на раму модели/представления

С логика адаптации данных Я имею в виду, когда данные должны быть преобразованы при извлечении и записи. Например, в sqlite тип date не существует, а QSqlTableModel извлекает даты как строки (но это даты, просто это не отражается в типе столбца), в результате чего QStyledItemDelegate показывает QLineEdit при редактировании ,

Чтобы изменить его в качестве даты, вы можете сделать две вещи:

  • установкой пользовательский делегат, который преобразует QVariant строку в QVariant дату, а также создает QDateEdit (и обратное преобразование при сохранении изданий).

  • выведение QSqlTableModel сделать то же преобразование для соответствующих столбцов, без необходимости установки какого-либо пользовательского делегата (QStyledItemDelegate распознает QVariant типа даты и показать QDateEdit автоматически).

Что я должен делать, или что такое «стандартный» или обычный способ сделать это в Qt?

Плюсы и минусы:

  • В делегате подходе модель нетронутые.
  • В модельном подходе вид нетронутый (для него не требуется получение представления).
  • Любой вид с использованием модели должен установить тот же пользовательский делегат для соответствующих столбцов. На модельном подходе каждый вид видит изменения без установки какого-либо делегата, который, я думаю, имеет наилучший пункт, на мой взгляд, поскольку модели считаются общими, но взглядов нет.
  • Один и тот же класс делегата может использоваться и для заголовков. В модельном подходе вы должны получить методы headerData s и data s, если вы хотите сделать любое преобразование по ним.
  • В отношении делегата, если вы хотите изменить модель представления, вам необходимо удалить ранее установленные делегаты, что вынуждает вас синхронизировать делегаты с моделями (делегат привязан к определенному столбцу конкретной модели таблицы).
+3

Я бы сделал это на уровне модели. Если вы не хотите прикасаться к модели, вы можете использовать 'QIdentityProxyModel' для преобразования данных. –

ответ

1

Вам нужна модель просмотра: адаптер, который передает ваше представление с данными, отформатированными правильно для просмотра/редактирования.

Такая модель рассматривается как прокси-модель. В этом конкретном случае это может быть очень простой QIdentityProxyModel, который преобразует строку в дату и наоборот.

Конечно, для представления нужен делегат редактора, который знает, как обращаться с QVariant, который несет дату, я не помню, если Qt предоставляет один по умолчанию. Если это не так, вы должны добавить его. Но проблемы разделены: вы создаете общий вид с возможностью редактирования дат, и вы создаете свою модель с правильным представлением даты.Связь между ними минимальна: представление не обязательно должно учитывать особенности вашей конкретной модели, и ваша модель не знает ничего особенного в самом представлении.