【问题标题】:QSqlTableModel: last checkstate change doesn't reflect on databaseQSqlTableModel:上次检查状态更改未反映在数据库上
【发布时间】:2017-01-06 22:30:21
【问题描述】:

我有 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;
}

【问题讨论】:

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

标签: mysql qt checkbox qsqltablemodel


【解决方案1】:

QSqlTabelModel 的默认“编辑策略”是OnRowChange,这意味着,顾名思义,当所选行发生更改时,才提交更改。其他时间提交修改到数据库,需要要么修改编辑策略为OnFieldChange,要么在合适的时候手动调用submit()submitAll()

【讨论】:

    猜你喜欢
    • 2020-01-07
    • 2023-02-10
    • 1970-01-01
    • 2020-12-07
    • 2013-08-22
    • 1970-01-01
    • 1970-01-01
    • 2021-11-25
    • 2021-11-16
    相关资源
    最近更新 更多