Чекбокс в QTableView можно реализовать только средствами модели данных, но лучше через визульный делегат.
Вариант чекбокса из модели данных
Чекбокс появляется в QTableView при использовании в функции data в ответе на роль Qt::CheckStateRole значений Qt::Checked или Qt::Unchecked.
if(role == Qt::CheckStateRole) // наличие этого показывает чекБокс !!!!
{
QVariant vv = table_QSqlRelationalTableModel::data(idx , Qt::UserRole);
if(vv.toBool())
return Qt::Checked;
else
return Qt::Unchecked;
}
Переключение состояние чекбокса происходит двойным щелчком по ячейки таблицы.
Рядом с чекбоксом отображается текст типа true/false, который можно очистить и достигается это 2-х уровневым наследованием от QSqlTableModel и игрой с UserData. При этом делегат не используется. Но полностью убрать область под текст не получается. К тому же 2 раза наследоваться это перебор.
Для чекбокса через flags отдаем следующие варианты:
Qt::ItemIsEnabled нужен чтобы срабатывал setData.
Qt::ItemIsUserCheckable не вызывает setData (пока не понятно на что влияет).
Qt::ItemIsSelectable нужен , чтобы выделение строки вызывало выделение и у этого поля (это для дизайна).
Минус в том , что чекбокс нормально работает, но рядом с чекбоксом остается пустое поле куда выводится data DisplayRole (QVariant()) и убрать его не получается никак.
Делегат
Делегат красиво решает все проблемы. Тут вы сами отрисовываете изображение , центрируете как вам угодно и т.д. Делается это переопределением метода paint.

Проблема может возникнуть с отрисовкой фона, когда делегат является частью области выделения в выделенной строке, например в QTableView.
Но все решается как например здесь скачать sql форк , открытый проект развития Qt.