Для чего может понадобиться переопределять метод 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.