我有一个简单的逻辑,基本上是这样的:从源模型(我的自定义QAbstractTableModel
)过滤了一些条目,并使用QSortFilterProxyModel
呈现给用户,filterAcceptsRow
只修改了{ {1}}功能。此演示文稿使用简单对话框完成。用户从过滤的条目中选择所需的条目,并且必须更新模型中的所选条目(实际上必须修改两个字段)。所以简化的代码是这样的:
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;
}
有什么想法吗?
感谢。