В Qt 4.8 и более старших версиях сделана базовая возможность отображать галки на строках для объектов класса QListView, QTableView или QTreeView.
Если читать документацию или обложиться литературой по Qt, то практически невозможно понять, что же нужно сделать, чтобы галки начали отображаться? Не запоминаться, не нажиматься, а хотя бы отображаться.
Так вот, для того, чтобы увидеть галки на QListView, QTableView или QTreeView, нужно сделать всего одну вещь: в модели, в переопределенном методе data(), надо для роли Qt::CheckStateRole начать возвращать значения true или false (в формате QVariant, естественно). Если этого не сделать, какие бы флаги ни получались из модели через переопределенный метод flags(), сами галки отображаться не будут.
То есть, метод data() модели должен выглядеть примерно таким образом:
// Получение данных модели
QVariant ChkTreeModel::data(const QModelIndex &index, int role) const
{
if (!index.isValid())
return QVariant();
if (role == Qt::DisplayRole)
{
ChkTreeItem *item = static_cast<ChkTreeItem*>(index.internalPointer());
return item->data(index.column());
}
if(role == Qt::CheckStateRole and index.column()==0){
return false; // Галка всегда включена в первом столбце, для отладки
}
return QVariant();
}
Другими словами, фактом того, что в виде видна галочка, служит тот факт, что метод data() возвращает "осмысленное" значение для роли Qt::CheckStateRole , а не пустой объект типа QVariant.
То, что галка начала отображаться, еще не значит, что она начнет нажиматься и менять свое состояние. Для того, чтобы разрешить такое действие, модель должна возвращать сответствующий флаг. И делается это в переопределенном методе flags():
// Флаги поведения модели
Qt::ItemFlags ChkTreeModel::flags(const QModelIndex &index) const
{
if (!index.isValid())
{
return 0;
}
Qt::ItemFlags flag=Qt::ItemIsEnabled | Qt::ItemIsSelectable;
// Галка в первом столбце должна быть редактируемой пользователем
if (index.column()==0)
{
flag |= Qt::ItemIsUserCheckable;
}
return flag;
}
Это базовые действия, которые необходимо сделать для начала работы с галками в списковых видах. Понимая вышеприведенную информацию, далее уже проще разобраться в том, как сохранять значения нажатых/ненажатых галочек в модели.
Примечание: для значений роли Qt::CheckStateRole можно возвращать не значения true/false, а специальные значения Qt::Checked / Qt::PartiallyChecked / Qt::Unchecked.