QSortFilterProxyModel: don't call index(row, 0) if there are no columns
This is invalid, e.g. it asserts in QConcatenateTablesProxyModel::index() Fixes: QTBUG-134210 Change-Id: I21acad9497d423b0366991296e8dd498d51395ea Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io> (cherry picked from commit 93694e99c214a5166fc842f92659e42260230dce) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
This commit is contained in:
parent
4003ca0d32
commit
149be782bb
@ -434,6 +434,10 @@ bool QSortFilterProxyModelPrivate::recursiveChildAcceptsRow(int source_row, cons
|
||||
{
|
||||
Q_Q(const QSortFilterProxyModel);
|
||||
|
||||
const int colCount = model->columnCount(source_parent);
|
||||
if (colCount == 0) // don't call index(row, 0) if there's no such column
|
||||
return false;
|
||||
|
||||
const QModelIndex index = model->index(source_row, 0, source_parent);
|
||||
const int count = model->rowCount(index);
|
||||
|
||||
|
@ -83,6 +83,7 @@ private Q_SLOTS:
|
||||
void shouldPropagateDropBetweenItemsAtModelBoundary();
|
||||
void shouldPropagateDropAfterLastRow_data();
|
||||
void shouldPropagateDropAfterLastRow();
|
||||
void addModelWithFilterOnTop();
|
||||
void qtbug91788();
|
||||
void qtbug91878();
|
||||
void createPersistentOnLayoutAboutToBeChanged();
|
||||
@ -864,6 +865,39 @@ void tst_QConcatenateTablesProxyModel::shouldPropagateDropAfterLastRow()
|
||||
|
||||
}
|
||||
|
||||
class RefuseRowsProxy : public QSortFilterProxyModel
|
||||
{
|
||||
public:
|
||||
bool filterAcceptsRow(int source_row, const QModelIndex &source_parent) const override
|
||||
{
|
||||
Q_UNUSED(source_row)
|
||||
Q_UNUSED(source_parent)
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
void tst_QConcatenateTablesProxyModel::addModelWithFilterOnTop() // QTBUG-134210
|
||||
{
|
||||
// Given a QSFPM -> QConcatenateTablesProxyModel and a QStandardItemModel
|
||||
QStandardItemModel sim;
|
||||
sim.appendRow(new QStandardItem("ITEM"));
|
||||
|
||||
QConcatenateTablesProxyModel concat;
|
||||
RefuseRowsProxy proxyFilter;
|
||||
proxyFilter.setSourceModel(&concat);
|
||||
proxyFilter.setRecursiveFilteringEnabled(true);
|
||||
|
||||
// When adding the QStandardItemModel as source model
|
||||
concat.addSourceModel(&sim);
|
||||
|
||||
// Then the item should be filtered out
|
||||
// (without hitting an assert in QConcat::index() nor an infinite recursion in QSFPM)
|
||||
QCOMPARE(concat.rowCount(), 1);
|
||||
QCOMPARE(concat.columnCount(), 1);
|
||||
QCOMPARE(proxyFilter.rowCount(), 0);
|
||||
QCOMPARE(proxyFilter.columnCount(), 1);
|
||||
}
|
||||
|
||||
void tst_QConcatenateTablesProxyModel::qtbug91788()
|
||||
{
|
||||
QConcatenateTablesProxyModel proxyConcat;
|
||||
|
Loading…
x
Reference in New Issue
Block a user