0

我有一个简单的逻辑,基本上是这样的:从源模型(我的自定义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;
}

有任何想法吗?

谢谢。

4

0 回答 0