Во-первых, вам нужно изменить TreeItem, чтобы отслеживать проверенное состояние:
private:
...
bool checked;
и сеттер и геттер:
bool isChecked() const { return checked; }
void setChecked( bool set ) { checked = set; }
Теперь необходимо изменить модель, чтобы представление узнало о состоянии проверки:
QVariant TreeModel::data(const QModelIndex &index, int role) const
{
if (!index.isValid())
return QVariant();
TreeItem *item = static_cast<TreeItem*>(index.internalPointer());
if ( role == Qt::CheckStateRole && index.column() == 0 )
return static_cast< int >( item->isChecked() ? Qt::Checked : Qt::Unchecked );
if (role != Qt::DisplayRole)
return QVariant();
return item->data(index.column());
}
и измените метод флагов модели, чтобы представления знали, что модель содержит проверяемые элементы:
Qt::ItemFlags TreeModel::flags(const QModelIndex &index) const
{
if (!index.isValid())
return 0;
Qt::ItemFlags flags = Qt::ItemIsEnabled | Qt::ItemIsSelectable;
if ( index.column() == 0 )
flags |= Qt::ItemIsUserCheckable;
return flags;
}
Я думаю, что это должно сделать это. Если вы хотите иметь возможность обновлять состояние проверки TreeItem, когда пользователь выбирает и снимает отметку с элементов, то вам необходимо предоставить метод QAbstractItemModel :: setData в TreeModel.