diff options
author | Stephen Kelly <stephen.kelly@kdab.com> | 2012-08-06 15:02:49 (GMT) |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2012-08-08 11:15:24 (GMT) |
commit | 9338a26614ce6a50a6c1d30e40dfaceacdfd4912 (patch) | |
tree | dfb1b5feed1314de271ed7356735beab24428e03 /tests | |
parent | ada98493bbfbd9af0d0b593017e29d39bcd3495e (diff) | |
download | Qt-9338a26614ce6a50a6c1d30e40dfaceacdfd4912.zip Qt-9338a26614ce6a50a6c1d30e40dfaceacdfd4912.tar.gz Qt-9338a26614ce6a50a6c1d30e40dfaceacdfd4912.tar.bz2 |
Avoid crashes when invalidating a proxy model filter.
Backport of b84e180263d0da3d1e6967fcf759225a778ea6ea
from qtbase.
Task-number: QTBUG-26107
Change-Id: I8323b19ce7b641165de21ad9a6e6b05bf4d93b1c
Reviewed-by: Olivier Goffart <ogoffart@woboq.com>
Diffstat (limited to 'tests')
-rw-r--r-- | tests/auto/qsortfilterproxymodel/tst_qsortfilterproxymodel.cpp | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/tests/auto/qsortfilterproxymodel/tst_qsortfilterproxymodel.cpp b/tests/auto/qsortfilterproxymodel/tst_qsortfilterproxymodel.cpp index 3961aeb..8ab5098 100644 --- a/tests/auto/qsortfilterproxymodel/tst_qsortfilterproxymodel.cpp +++ b/tests/auto/qsortfilterproxymodel/tst_qsortfilterproxymodel.cpp @@ -151,6 +151,7 @@ private slots: void mapSelectionFromSource(); void testResetInternalData(); void filteredColumns(); + void hierarchyFilterInvalidation(); protected: void buildHierarchy(const QStringList &data, QAbstractItemModel *model); @@ -3409,5 +3410,70 @@ void tst_QSortFilterProxyModel::testResetInternalData() } +class FilterProxy : public QSortFilterProxyModel +{ + Q_OBJECT +public: + FilterProxy(QObject *parent = 0) + : QSortFilterProxyModel(parent), + mode(false) + { + + } + +public slots: + void setMode(bool on) + { + mode = on; + invalidateFilter(); + } + +protected: + virtual bool filterAcceptsRow ( int source_row, const QModelIndex & source_parent ) const + { + if (mode) { + if (!source_parent.isValid()) { + return true; + } else { + return (source_row % 2) != 0; + } + } else { + if (!source_parent.isValid()) { + return source_row >= 2 && source_row < 10; + } else { + return true; + } + } + } + +private: + bool mode; +}; + +void tst_QSortFilterProxyModel::hierarchyFilterInvalidation() +{ + QStandardItemModel model; + for (int i = 0; i < 10; ++i) { + QStandardItem *child = new QStandardItem(QString("Row %1").arg(i)); + for (int j = 0; j < 1; ++j) { + child->appendRow(new QStandardItem(QString("Row %1/%2").arg(i).arg(j))); + } + model.appendRow(child); + } + + FilterProxy proxy; + proxy.setSourceModel(&model); + + QTreeView view; + view.setModel(&proxy); + + view.setCurrentIndex(proxy.index(2, 0).child(0, 0)); + + view.show(); + QTest::qWaitForWindowShown(&view); + + proxy.setMode(true); +} + QTEST_MAIN(tst_QSortFilterProxyModel) #include "tst_qsortfilterproxymodel.moc" |