чекбокс в QTableView

Чекбокс в 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()) и убрать его не получается никак.

Делегат

Делегат красиво решает все проблемы. Тут вы сами отрисовываете изображение , центрируете как вам угодно, используете векторную графику (например svg) и т.д. Делается это переопределением метода paint.

фотка 1

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

Но все решается как например здесь скачать QSqlTableModel-QTableView форк , открытый проект развития Qt.


QTableView новые возможности.