QSqlTableModel:上次检查状态更改未反映在数据库中
QSqlTableModel: last checkstate change doesn't reflect on database
我有 MySQL 数据库,QSqlTableModel
和 QTableView
只有很少的复选框列。它有效,但最后一次单击复选框不会导致数据库发生变化。这意味着如果我启动一个程序,单击某个复选框一次并关闭程序,将不会对数据库进行任何更改。如果我要更改几个复选框的状态,最后的更改将不会显示在数据库中。也许我的 setData
方法有问题?
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;
}
QSqlTabelModel
的默认值"edit strategy"为OnRowChange
,这意味着在选定的行更改时,只有名称所建议的更改才能提交。要在其他时间提交对数据库的更改,您需要将编辑策略更改为 OnFieldChange
,或者在适当的时候手动调用 submit()
或 submitAll()
。
我有 MySQL 数据库,QSqlTableModel
和 QTableView
只有很少的复选框列。它有效,但最后一次单击复选框不会导致数据库发生变化。这意味着如果我启动一个程序,单击某个复选框一次并关闭程序,将不会对数据库进行任何更改。如果我要更改几个复选框的状态,最后的更改将不会显示在数据库中。也许我的 setData
方法有问题?
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;
}
QSqlTabelModel
的默认值"edit strategy"为OnRowChange
,这意味着在选定的行更改时,只有名称所建议的更改才能提交。要在其他时间提交对数据库的更改,您需要将编辑策略更改为 OnFieldChange
,或者在适当的时候手动调用 submit()
或 submitAll()
。