чекбокс в QTableView

Чекбокс в QTableView.

Вариант чекбокса без делегатов:

фотка 1

Чекбокс появляется в 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.

Но это решается , см. на соседней странице QComboBox делегат.