mysql - QSqlTableModel:最后的检查状态更改不会反射(reflect)在数据库上

标签 mysql qt checkbox qsqltablemodel

我有 MySQL 数据库、QSqlTableModelQTableView,其中有几个复选框列。它可以工作,但最后一次单击复选框不会导致数据库发生更改。这意味着如果我启动一个程序,单击某个复选框一次并关闭程序,则不会对数据库进行任何更改。如果我要更改几个复选框的状态,最后一次更改将不会显示在数据库中。也许我的 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,这意味着,顾名思义,只有在所选行发生更改时才会提交更改。要在其他时间向数据库提交更改,您需要将编辑策略更改为 OnFieldChange,或者手动调用 submit()submitAll() 在适当的时间。

关于mysql - QSqlTableModel:最后的检查状态更改不会反射(reflect)在数据库上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41515425/

相关文章:

java - Tomcat 连接池创建太多连接,卡在 sleep 模式

php - 这是执行 mysql 查询的正确方法吗

qt - QNetworkAccessManager 文件上传错误

qt - 如何从 QML 访问在 C++ 类中声明的 Q_ENUM?

android - 复选框无法与 ListView 一起正常工作

javascript - 如何触发选中所有复选框?

php - Doctrine 中的 mysql_close() 替代方案

python - QT 定时器不调用函数

c# - 在 ASP.Net 中动态取消选中复选框时,CheckBox 不会触发 CheckedChanged 事件

php - 如果 IN 子句在 Mysql 中为空,则给出所有行