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