C++ (Qt)QVariant myModel::data ( const QModelIndex &index, int role ) const{ if (!index.isValid()) return QVariant(); ......... if( role == Qt::CheckStateRole ) { if( index.data(Qt::EditRole).isNull() ) return Qt::PartiallyChecked; return index.data(Qt::EditRole).toInt() == Qt::Unchecked ? Qt::Unchecked : Qt::Checked; } return standardModel::data(index,role);} bool myModel::setData(const QModelIndex &index, const QVariant &value, int role){................. if( role == Qt::CheckStateRole ) { if( flags(index) & Qt::ItemIsTristate ) { if(index.data(Qt::EditRole).isNull()) return setData(index,Qt::Checked,Qt::EditRole); setData(index,index.data(Qt::EditRole).toInt() == Qt::Checked ? QVariant():Qt::Unchecked,Qt::EditRole); } }.................}
bool myModel::setData(const QModelIndex &index, const QVariant &value, int role){................. if( role == Qt::CheckStateRole ) { if( flags(index) & Qt::ItemIsTristate ) { if(index.data(Qt::EditRole).isNull()) return setData(index,Qt::Checked,Qt::EditRole); setData(index,index.data(Qt::EditRole).toInt() == Qt::Checked ? QVariant():Qt::Unchecked,Qt::EditRole); } }.................}
C++ (Qt) QStandardItemModel m; QListView v; v.setModel(&m); m.setRowCount(3); m.setItem(0,new QStandardItem("item 1")); m.setItem(1,new QStandardItem("item 2")); m.setItem(2,new QStandardItem("item 3")); for(int i=0;i<m.rowCount();++i) { m.item(i)->setFlags(m.item(i)->flags()|Qt::ItemIsUserCheckable); m.item(i)->setData(Qt::PartiallyChecked,Qt::CheckStateRole); } v.show(); return a.exec();
bool myModel::setData(const QModelIndex &index, const QVariant &value, int role){/*тут подготовка всякая*/ if (role == Qt::CheckStateRole) if( (flags(index) & Qt::ItemIsTristate ) && (index.data(Qt::EditRole) == Qt::Unchecked) && (value == Qt::Checked)) return setData(index, Qt::PartiallyChecked, role);/*тут собственно запись через вызов доп функции, все взято с учебников, про редактируемую QSqlQueryModel, но применено к QSqlTableModelbool setDataToQuery(strWhereCond, index.column(), value);*/ bool ok = setDataToQuery(strWhereCond, index.column(), value); if (ok) QSqlTableModel::setData(index, value); return ok;}
if (role == Qt::CheckStateRole) if( (flags(index) & Qt::ItemIsTristate ) && (index.data(Qt::EditRole) == Qt::Unchecked) && (value == Qt::Checked)) { bool ok = setData(index, Qt::PartiallyChecked, role); if (ok) emit dataChanged(index, index); return ok; }
setDataToQuery(strWhereCond, index.column(), value){...... switch(value.toInt()) { case Qt::PartiallyChecked: // если данные нет вообще updVal = "null"; break; case Qt::Checked: // если check updVal = "1"; break; case Qt::Unchecked: // если uncheck updVal = "0"; break; }......}
bool ok = setDataToQuery(strWhereCond, index.column(), value);
if (ok) QSqlTableModel::setData(index, value);
bool myModel::setData(const QModelIndex &index, const QVariant &value, int role){/*обратить внимание, что проверяется не только новое значение, но и состояние, а не значение предыдущего!*/ if (role == Qt::CheckStateRole) if( (flags(index) & Qt::ItemIsTristate ) && (!index.data(Qt::EditRole).isNull()) && (value == Qt::Checked)) return setData(index, Qt::PartiallyChecked, role);/*подготовка и всякая всячинатут собственно запись через вызов доп функции, все взято с учебников, про редактируемую QSqlQueryModel, но применено к QSqlTableModelобратить внимание на сохранение в модель!Тут 2 момента: само по себе сохранение, и что мы сохраняем для null!! Именно это и было камнем преткновения!bool setDataToQuery(strWhereCond, index.column(), value);*/ bool ok = setDataToQuery(strWhereCond, index.column(), value); if (ok) QSqlTableModel::setData(index, (value == Qt::PartiallyChecked ? QVariant( QVariant::Int ):value)); return ok;}