how set QCheckBox in QAbstractItemModel?
Solution 1
I didn't understand the Qt conception. You have to set data in setData()
(store check state) and then populate model in data()
with this new value being returned for checkbox, alike this:
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) {
checkedState_ = Qt::Checked;
}
else {
checkedState_ = Qt::Unchecked;
}
}
emit dataChanged(index, index);
return true;
}
data()
QVariant TreeModel::data(const QModelIndex &index, int role) const {
if (!index.isValid())
return QVariant();
if (role == Qt::CheckStateRole) {
if (index.column() == 1) {
return checkedState_;
}
}
else if (role == Qt::DisplayRole) {
if (index.column() != 1) {
TreeItem *item = static_cast<TreeItem*>(index.internalPointer());
return item->data(index.column());
}
}
return QVariant();
}
Solution 2
It seems strange to me that you are returning always the same result for the data(CheckStateRole)
if (role == Qt::CheckStateRole) {
if (index.column() == 1) {
if (index.row() == 1) {
return Qt::Unchecked;
} else
return Qt::Checked;
}
}
Unchecked for (1,1) and checked for ( distinct to 1 , 1)
setData() is being called, but then, when the view queries the model for a value, you return always the same in data()
Solution 3
Without any ItemDelegate
, in the flags
method you must return the flag: Qt::ItemIsUserCheckable
.
For more information see: http://qt-project.org/doc/qt-4.8/qt.html#ItemFlag-enum
![4pie0](https://i.stack.imgur.com/t1JZE.png?s=256&g=1)
4pie0
>> p = [1 0 1]; >> roots(p) ans = 0.000000000000000 + 1.000000000000000i 0.000000000000000 - 1.000000000000000i
Updated on June 16, 2022Comments
-
4pie0 about 2 years
I have a model
class TreeModel : public QAbstractItemModel
which I populate with instances of my
TreeItem
excluding column==1. In column 1 I've createdCheckBoxes
: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(); }
I can set these CheckBoxes statues to
Qt::Checked
orQt::Unchecked
but my problem is: I cannot change them later when they are clicked (howeversetData
is called with appropriateindex.column==1
androle==Qt::CheckStateRole
). I have seen examples withItemDelegate
- only this seems to work. Is this true? Do I have to use delegate in this scenario?Here is my
setData()
function: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; }