как установить QCheckBox в QAbstractItemModel?

У меня есть модель

class TreeModel : public QAbstractItemModel

который я заполняю экземплярами моего TreeItem исключая столбец == 1. В колонка 1 Я создал CheckBoxes:

QVariant TreeModel::data(const QModelIndex &index, int role) const {
if (!index.isValid())
return QVariant();

if (role != Qt::DisplayRole) {
if (role == Qt::CheckStateRole) {
if (index.column() == 1) {
if (index.row() == 1) {
return Qt::Unchecked;
} else
return Qt::Checked;
}
}
return QVariant();
}
if (role == Qt::DisplayRole) {
if (index.column() != 1) {
TreeItem *item = static_cast<TreeItem*>(index.internalPointer());
return item->data(index.column());
}
}
return QVariant();
}

Я могу установить эти статуи CheckBoxes в Qt::Checked или же Qt::Unchecked но моя проблема:
Я не могу изменить их позже, когда они нажаты (тем не мение setData называется с соответствующим index.column==1 а также role==Qt::CheckStateRole).
Я видел примеры с ItemDelegate — только это, кажется, работает. Это правда? Должен ли я использовать делегат в этом сценарии?

Вот мой setData() функция:

bool TreeModel::setData(const QModelIndex & index, const QVariant & value,
int role) {
if (role==Qt::CheckStateRole && index.column() == 1) {
TreeItem *item = static_cast<TreeItem*>(index.internalPointer());
QTreeWidgetItem *check = static_cast<QTreeWidgetItem*>(index.internalPointer());

//if (item->data(index.column()) == Qt::Checked)
if (value == Qt::Checked){
int i=1;
//check->setCheckState(1,Qt::Checked); //SIGSEGV
}else{
//(item->data(index.column())) = Qt::Unchecked;
int i=2;
//check->setCheckState(1,Qt::Unchecked);
}

emit dataChanged(index, index);
return true;
}
emit dataChanged(index, index);
return true;;
}Qt::ItemFlags TreeModel::flags(const QModelIndex &index) const {
if (!index.isValid())
return 0;

return Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsUserCheckable |  Qt::ItemIsEditable;
}

4

Решение

Я не понял концепцию Qt. Вы должны установить данные в setData (состояние проверки хранилища), а затем заполнить модель в data () этим новым значением, возвращаемым для флажка, аналогично этому:

SetData ()

bool TreeModel::setData(const QModelIndex & index, const QVariant & value,
int role) {
if (role==Qt::CheckStateRole && index.column() == 1) {
TreeItem *item = static_cast<TreeItem*>(index.internalPointer());
QTreeWidgetItem *check = static_cast<QTreeWidgetItem*>(index.internalPointer());

if (value == Qt::Checked){
int i=1;
checkedState_=Qt::Checked;
}else{
int i=2;
checkedState_=Qt::Unchecked;
}

данные()

QVariant TreeModel::data(const QModelIndex &index, int role) const {
if (!index.isValid())
return QVariant();

if (role != Qt::DisplayRole) {
if (role == Qt::CheckStateRole) {
if (index.column() == 1) {
return checkedState_;
}
}
return QVariant();
}
if (role == Qt::DisplayRole) {
if (index.column() != 1) {
TreeItem *item = static_cast<TreeItem*>(index.internalPointer());
return item->data(index.column());
}
}
return QVariant();
}
emit dataChanged(index, index);
return true;
}
emit dataChanged(index, index);
return true;;

}

5

Другие решения

Мне кажется странным, что вы возвращаете всегда один и тот же результат для данных (CheckStateRole)

 if (role == Qt::CheckStateRole) {
if (index.column() == 1) {
if (index.row() == 1) {
return Qt::Unchecked;
} else
return Qt::Checked;
}
}

Не проверено на (1,1) и проверено на (отличается от 1, 1)

setData () вызывается, но затем, когда представление запрашивает модель для значения, вы возвращаете всегда одно и то же в data ()

2

Без всяких ItemDelegate, в flags Метод, вы должны вернуть флаг: Qt::ItemIsUserCheckable,

Для получения дополнительной информации см .: http://qt-project.org/doc/qt-4.8/qt.html#ItemFlag-enum

1

Используя примеры из @Trompa и @tinky_winky, мне удалось создать этот рабочий пример, так как @Trompa предложил нам вернуть другое значение или сохранить это значение и извлечь его в наших data (), чтобы получить фактическое состояние по этому конкретному индексу.

QVector<int> status;
int SData::getStatus(int pos)
{
return status.at(pos);
}

void SData::setStatus(int pos,int value)
{
status.insert(pos, value);
}
QVariant STableModel::data(const QModelIndex &index, int role) const
{
if (!index.isValid())
return QVariant();

if (role == Qt::DisplayRole)
return rowList[index.row()][index.column()];
else if (role == Qt::CheckStateRole && index.column() == 0)
{

int status = SData::instance().getStatus(index.row());
if (status)
return Qt::Checked;
else
return Qt::Unchecked;
}
else
return QVariant();
}

bool STableModel::setData(const QModelIndex &index,
const QVariant &value, int role)
{
if (!index.isValid() /*|| role != Qt::EditRole*/)
return false;
if (role == Qt::CheckStateRole)
{
if ((Qt::CheckState)value.toInt() == Qt::Checked)
{
SData::instance().setStatus(index.row(),1);
return true;
}
else
{
SData::instance().setStatus(index.row(), 0);
return true;
}
}
0
По вопросам рекламы [email protected]