我有一个简单的逻辑,基本上是这样的:从源模型(我的自定义QAbstractTableModel
)中过滤出一些条目并使用 呈现给用户QSortFilterProxyModel
,它确实只有修改后的filterAcceptsRow
功能。这个演示是使用简单的对话框完成的。用户从过滤的条目中选择所需的条目,并且必须更新从模型中选择的条目(实际上必须修改两个字段)。所以简化的代码是这样的:
QModelIndexList selectedRows = myProxyModel->selectionModel()->selectedRows();
for (int i = 0; i < selectedRows.count(); i++) {
myProxyModel->setData(myProxyModel->index(selectedRows.at(i).row(), (int) LoanStatusCol, QModelIndex()), (int) ReturnedLoan, Qt::EditRole);
myProxyModel->setData(myProxyModel->index(selectedRows.at(i).row(), (int) LoanRetEntriesCol, QModelIndex()), (lastEntryNo + 1), Qt::EditRole);
}
但是,这不起作用。而且每次的行为都很奇怪。我注意到的是,当它在这个循环中到达第二个选定的行并且当它到达setData()
模型中的代码时:
bool TransactionModel::setData(const QModelIndex &index, const QVariant &value, int role) {
if (!index.isValid()) {
return false;
}
它返回无效索引。但是,当我交换这两个setData()
代码行时,更新了一行,但没有更新第二行 - 由于索引无效。我不知道我是否解释正确,但可能这应该是我的愚蠢错误,因为我是新手。
更新:由于模型由 QList 数据组成,其中 Transaction 是定义条目字段的自定义类,因此我创建了一个函数,该函数按列号更新底层条目(可以说......)。我使用函数setValueByColumnNo
。在使用自定义类列表时,我找不到更好的方法来做到这一点。
bool TransactionModel::setData(const QModelIndex &index, const QVariant &value, int role) {
if (!index.isValid()) {
return false;
}
if ((role == Qt::DisplayRole) || (role == Qt::EditRole)) {
transactionData[index.row()].setValueByColumnNo(index.column(), value);
emit dataChanged(index, index);
return true;
}
return false;
}
有任何想法吗?
谢谢。