Сразу надо понять , что не все роли в модели данных валидны! Как это так?
Всегда можно проверить валидость роли в модели данных примерно так :
QVariant vv = table_QSqlRelationalTableModel::data(idx , role);
qDebug() << " role data isValid : " << vv.isValid();
И например для роли Qt::BackgroundRole мы можем получить false.
А причина в том, что реально внутри QSqlTableModel отрабатываются только роли DisplayRole и EditRole.
Все остальные роли не реализованы.
То есть остальные роли надо реализовывать самостоятельно в классах наследниках.
Теперь надо поговорить о цветовых группах.
Класс QPalette содержит цветовую группу для каждого состояния виджета. Что это за состояния?
enum ColorGroup { Disabled, Active, Inactive, Normal }
enum ColorRole { Window, Background, WindowText, Foreground, ..., LinkVisited }
Надо понимать , что виджеты отрисовываются по событиям (paint) возникающим отнюдь не из кода программы и тем более не из модели данных.
События прилетают от устройств из прерываний операционной системы (мышка, клавитатура,...).
Эти события попадают в обработчики QTableView. Потом они попадают в paint каждой ячейки. Там происходит выполнение drawCell для поля.
Далее происходят вариации draw функций в зависимости от типа контрола поля.
drawComlexControl рисует например для типа QComboBox в поле фон, рамку, стрелку вниз.
drawControl рисует сам текст текущего элемента списка.
Один из самых значительных выносов мозга связан с пониманием как работает отрисовка Гуя (GUI) ибо в секунду может проскакивать сотни событий , связанных с отрисовкой.
Интересный вопрос - как влиять на стиль отображаемого контрола.
Оказыватся в параметрах вызываемого paint есть вся необходимая информация.