summaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorStephen Kelly <stephen.kelly@kdab.com>2012-08-06 15:02:49 (GMT)
committerQt by Nokia <qt-info@nokia.com>2012-08-08 11:15:24 (GMT)
commit9338a26614ce6a50a6c1d30e40dfaceacdfd4912 (patch)
treedfb1b5feed1314de271ed7356735beab24428e03 /tests
parentada98493bbfbd9af0d0b593017e29d39bcd3495e (diff)
downloadQt-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.cpp66
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"