setData returns false for QAbstractProxyModel

setData returns false for QAbstractProxyModel

本文关键字:QAbstractProxyModel for false returns setData      更新时间:2023-10-16

我有子类化QAbstractProxyModel,它的源模型是QSqlTableModel的子类。代理模型一次只能显示源模型的一行。代码如下:

bool SensorDisplayModel::setData(const QModelIndex &index, const QVariant &value, int role)
{
    if(!index.isValid())
        return false;
    QModelIndex sourceIdx = mapToSource(index);
    if(role == Qt::DisplayRole || role == Qt::EditRole)
    {
        if(sourceIdx.isValid())
        {
            if(sourceModel()->setData(sourceIdx, value, role))
            {
//                emit dataChanged(index, index);
                return true;
            }
            return false;
        }
        else
            return false;
    }
    return false;
}

源模型:

bool SensorModel::setData(const QModelIndex &index, const QVariant &value, int role)
{
    if(!index.isValid())
        return false;
    if(role == Qt::EditRole || role == Qt::DisplayRole)
    {
        if(index.column() != 0)
            return QSqlTableModel::setData(index, value, Qt::EditRole)  &&
                QSqlTableModel::setData(index, value, Qt::DisplayRole);
        else
            return QSqlTableModel::setData(index, value, role);
    }
    return false;
}

当必须向源模型添加新行时,将调用以下内容:

void SensorDisplayModel::addSensor()
{
    QString ro_id;
    bool success = false;
    if(sensorModel->insertRows(sensorModel->rowCount(), 1))
    {
        selectedRow = sensorModel->rowCount() - 1;
        ro_id = "DB-" + QString("%1").arg(SensorDisplayModel::id_no,
                                          3, 10, QChar('0'));
        comboBoxItems.append(ro_id);
        success = setData(createIndex(0, 0), QVariant(comboBoxItems), Qt::EditRole);
        success &= setData(createIndex(0, 0), QVariant(ro_id), Qt::DisplayRole);
        SensorDisplayModel::id_no++;
        success &= setData(createIndex(0, 1), QVariant(QString("Name")));
        success &= setData(createIndex(0, 2), QVariant(-1));
        success &= setData(createIndex(0, 3), QVariant(-1));
        success &= setData(createIndex(0, 4), QVariant((long long)0));
        success &= setData(createIndex(0, 5), QVariant(QString("??")));
        success &= setData(createIndex(0, 6), QVariant(QString("??")));
        if(success)
            emit dataChanged(createIndex(0, 0), createIndex(0, columnCount() - 1));
        ID2Row[data(createIndex(0, 0)).toString()] = selectedRow;
    }
}

selectedRow 是保存源模型的当前行的私有成员。

setData() 总是返回 false。源模型设置为手动提交。我做错了什么?

编辑:

我想通了问题所在。我使用的源模型是 QSqlTableModel 的一个子类,它为 EditRole 以外的任何角色调用 QSqlQueryModel 的 setData。由于 QSqlQueryModel 本身不会重新实现 setData,因此它调用 QAbstractItemModel 的 setData,该 setData 总是返回 false。

因此,我现在使用 EditRole 进行所有 setData() 调用,data() 从存储在 EditRole 下的源模型中返回值。

在这里,您仅为EditRoleDisplayRole设置数据。其他角色(如 ForegroundRole)不会设置,因为返回 false。显然,您不需要对这两个模型进行子类化,因为您的代码除了标准类之外什么都不做。如果您想稍后添加一些代码,至少将第一个块中的最后一个return false更改为

return QAbstractProxyModel::setData(index,value,role);

和最后一个return false在第二个块到

return QSqlTableModel::setData(index,value,role);

另外,这个:

    if(index.column() != 0)
        return QSqlTableModel::setData(index, value, Qt::EditRole)  &&
            QSqlTableModel::setData(index, value, Qt::DisplayRole);
    else
        return QSqlTableModel::setData(index, value, role);

没有任何意义。

相关文章:
  • 没有找到相关文章