Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql QSqlTableModel:last checkstate更改不';不要反省数据库_Mysql_Qt_Checkbox_Qsqltablemodel - Fatal编程技术网

Mysql QSqlTableModel:last checkstate更改不';不要反省数据库

Mysql QSqlTableModel:last checkstate更改不';不要反省数据库,mysql,qt,checkbox,qsqltablemodel,Mysql,Qt,Checkbox,Qsqltablemodel,我有MySQL数据库,QSqlTableModel和QTableView,几乎没有复选框列。它可以工作,但最后一次单击复选框不会导致数据库中的更改。这意味着,若我启动一个程序,单击某个复选框一次并关闭该程序,则不会对数据库进行任何更改。如果我要更改几个复选框的状态,最后的更改将不会显示在数据库中。也许我的setData方法有问题 bool PartyModel::setData(const QModelIndex &index, const QVariant &value, in

我有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
的默认“编辑策略”是
OnRowChange
,这意味着只有在所选行发生更改时,才会提交更改,顾名思义。若要在其他时间向数据库提交更改,您需要将编辑策略更改为
onieldchange
,或者在适当的时间手动调用
submit()
submitAll()

“默认编辑策略为OnRowChange”。可能您需要将编辑策略设置为
onfildchange
,或者在模型被销毁时确保
model->submitAll()
。@E4z9谢谢,在
return()
之前
submit()
是解决方案。作为答案添加了它