Надо ли переопределять data

Для чего может понадобиться переопределять метод data модели данных?

Чтобы отображать в полях таблицы вместо чисел другую визуально понятную информацию можно как вариант просто переопределить класс QSqlTableModel и подменить поведение data(..) .

Надо учитывать , что data(..) вызывается не однотипно, а каждый раз с указанием той роли , то есть того типа информации, которую надо получить.Роли в модели данных.

Кстати кто вызывает data? Это например визуальные объекты типа QTableView.

При сответствующей настройке ролей для поля таблицы можно визульно получить чекбокс например, или можно выделять поля цветом в зависимости от значения поля, можно отображать картинки в полях и еще много чего.

Но чтобы отобразить QComboBox (выпадающий список) для выбора значения в поле таблицы придется создавать и использовать делегат.

То есть делать для ячейки таблицы визуальную подмену.

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

В data можно использовать переопределение ролей отличных от DisplayRole и EditRole.

Например можно в data подсвечивать другим цветом фон ячейки таблицы или цвет текста в зависимости от значения поля, можно отображать дополнительно картинки в полях. Но не надо влиять на значения полей, то есть не надо подменять значения DisplayRole.

Дело в том, что кроме вашей визуальной таблицы (например QTableView) через data к модели данных могут обращаться и другие объекты.

И если вы для QTableView из data возвращаете строку "ошибка" при значении допустим 123, то и другие объекты получат строку "ошибка", хотя объекты обычно хотят получить реально хранимое значение 123.

Другой пример для переопределения data на первый взгляд напрашивается для QSqlRelationalModel, а точнее для поля внешнего ключа или по другому relation.

Дело в том, что для значения relation будет всегда возвращаться подмена даже на уровне QSqlQuery::data,то есть вместо id ключа его тестовое значение, потому что в самом SELECT к базе данных будет запрашиваться текстовое поле,  а поля id  связи вообще не будет пртсутствовать в запросе.

Может показаться, что надо переопределить data и для Qt::UserRole возвращать id связи, который получать отдельно каждый раз через QSqlQuery запрос внутри функции data. Это тоже вариант, но он нагружает сеть запросами к базе.

Но есть другой вариант: лайфхак
QSqlRelationalTableModel
.

Или форк Развиваем класс QSqlTableModel.