One major difference I have found is that KConcatenateRowsProxyModel will check if sourceModel exists when mapping from/to sourceModel, but QConcatenateTablesProxyModel won't. So if QConcatenateTablesProxyModel doesn't receive `rowsRemoved` signal from sourceModel, QConcatenateTablesProxyModel will crash the program.

For example:

# KConcatenateRowsProxyModel

```cpp
QModelIndex KConcatenateRowsProxyModel::index(int row, int column, const QModelIndex &parent) const
{
    if (row < 0) {
        return {};
    }
    if (column < 0) {
        return {};
    }
    int sourceRow;
QAbstractItemModel *sourceModel = d->sourceModelForRow(row, &sourceRow);
    if (!sourceModel) {
        return QModelIndex();
    }
    return mapFromSource(sourceModel->index(sourceRow, column, parent));
}
```

# QConcatenateTablesProxyModel

```cpp
QModelIndex QConcatenateTablesProxyModel::index(int row, int column, const QModelIndex &parent) const
{
    Q_D(const QConcatenateTablesProxyModel);
    Q_ASSERT(hasIndex(row, column, parent));
    if (!hasIndex(row, column, parent))
        return QModelIndex();
Q_ASSERT(checkIndex(parent, QAbstractItemModel::CheckIndexOption::ParentIsInvalid)); // flat model
    const auto result = d->sourceModelForRow(row);
    Q_ASSERT(result.sourceModel);
return mapFromSource(result.sourceModel->index(result.sourceRow, column));
}
```

Reply via email to