gpt4 book ai didi

c++ - setData 为 QAbstractProxyModel 返回 false

转载 作者:行者123 更新时间:2023-11-30 05:18:48 25 4
gpt4 key购买 nike

我对 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 是私有(private)成员,保存源模型的当前行。

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

编辑:

我发现了问题。我使用的源模型是QSqlTableModel的一个子类,除了EditRole之外的任何角色,它都会调用QSqlQueryModel的setData。由于 QSqlQueryModel 本身并没有重新实现 setData,它调用 QAbstractItemModel 的 setData 总是返回 false。

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

最佳答案

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

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

最后一个 在第二个 block 中返回 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);

没有任何意义。

关于c++ - setData 为 QAbstractProxyModel 返回 false,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41440606/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com