如何在QAbstractItemModel中设置QCheckBox?

4pi*_*ie0 5 c++ checkbox qt qtreeview qabstractitemmodel

我有一个模特

class TreeModel : public QAbstractItemModel
Run Code Online (Sandbox Code Playgroud)

我填充了我的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();
  }
Run Code Online (Sandbox Code Playgroud)

我可以设置这些复选框雕像Qt::CheckedQt::Unchecked但我的问题是: 我不能改变他们后来被点击时,他们(但setData被调用适当的index.column==1role==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;
  }
Run Code Online (Sandbox Code Playgroud)

4pi*_*ie0 6

我不明白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;
        }
Run Code Online (Sandbox Code Playgroud)

数据()

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;;
Run Code Online (Sandbox Code Playgroud)

}