0
私はMySQLデータベース、QSqlTableModel
とQTableView
のチェックボックス列がほとんどありません。それは動作しますが、チェックボックスを最後にクリックしてもデータベースは変更されません。つまり、プログラムを起動すると、チェックボックスを一回クリックしてプログラムを終了すると、データベースの変更は行われません。複数のチェックボックスの状態を変更すると、最後の変更はデータベースに表示されません。おそらく私のsetData
メソッドに何か問題がありますか?QSqlTableModel:最後のチェックステートの変更がデータベースに反映されません
bool PartyModel::setData(const QModelIndex &index, const QVariant &value, int role)
{
QString h=headerData(index.column(),Qt::Horizontal).toString();
QVariant v=value;
switch(role)
{
case Qt::CheckStateRole:
if(h=="One" || h=="Two" || h=="Three" || h=="Four")
{
if(value.toInt()==Qt::Unchecked) v=0;
else v=1;
bool ret = QSqlTableModel::setData(index,v,Qt::EditRole);
if(ret) emit dataChanged(index,index);
return ret;
}
break;
case Qt::DisplayRole:
case Qt::EditRole:
.......
break;
default:
break;
}
return QSqlTableModel::setData(index,v,role);
}
QVariant PartyModel::data(const QModelIndex &idx, int role) const
{
QString h=headerData(idx.column(),Qt::Horizontal).toString();
QVariant v=QSqlTableModel::data(idx,role);
switch(role)
{
case Qt::CheckStateRole:
if(h=="One" || h=="Two" || h=="Three" || h=="Four")
v = (QSqlTableModel::data(idx,Qt::DisplayRole).toInt()==0 ? Qt::Unchecked : Qt::Checked);
break;
case Qt::DisplayRole:
if(h=="One" || h=="Two" || h=="Three" || h=="Four")
v="";
break;
default:
break;
}
return v;
}
Qt::ItemFlags PartyModel::flags(const QModelIndex &index) const
{
QString h=headerData(index.column(),Qt::Horizontal).toString();
Qt::ItemFlags f=QSqlQueryModel::flags(index);
if(h=="One" || h=="Two" || h=="Three" || h=="Four")
{
f |= Qt::ItemIsUserCheckable;
f &= ~Qt::ItemIsEditable;
}
return f;
}
"デフォルトの編集方法はOnRowChangeです。"おそらく、あなたは 'OnFieldChange'に編集戦略を設定するか、モデルが破壊されたときに' model-> submitAll() 'を確認する必要があります。 – E4z9
@ E4z9ありがとうございました、 'return()'の前の 'submit()'が解決策でした。 –
が回答として追加されました – E4z9