diff options
-rw-r--r-- | src/sql/models/qsqlquerymodel.cpp | 14 | ||||
-rw-r--r-- | src/sql/models/qsqlquerymodel_p.h | 4 | ||||
-rw-r--r-- | tests/auto/sql/models/qsqlquerymodel/tst_qsqlquerymodel.cpp | 57 |
3 files changed, 65 insertions, 10 deletions
diff --git a/src/sql/models/qsqlquerymodel.cpp b/src/sql/models/qsqlquerymodel.cpp index dc9ef0d616..ea3bc7f20b 100644 --- a/src/sql/models/qsqlquerymodel.cpp +++ b/src/sql/models/qsqlquerymodel.cpp @@ -78,10 +78,10 @@ void QSqlQueryModelPrivate::prefetch(int limit) atEnd = true; // this is the end. } if (newBottom.row() >= 0 && newBottom.row() > bottom.row()) { - if (!resetting) + if (!nestedResetLevel) q->beginInsertRows(QModelIndex(), bottom.row() + 1, newBottom.row()); bottom = newBottom; - if (!resetting) + if (!nestedResetLevel) q->endInsertRows(); } else { bottom = newBottom; @@ -215,10 +215,9 @@ bool QSqlQueryModel::canFetchMore(const QModelIndex &parent) const void QSqlQueryModel::beginResetModel() { Q_D(QSqlQueryModel); - if (!d->resetting) { + if (!d->nestedResetLevel) QAbstractTableModel::beginResetModel(); - d->resetting = true; - } + ++d->nestedResetLevel; } /*! \internal @@ -226,10 +225,9 @@ void QSqlQueryModel::beginResetModel() void QSqlQueryModel::endResetModel() { Q_D(QSqlQueryModel); - if (d->resetting) { - d->resetting = false; + --d->nestedResetLevel; + if (!d->nestedResetLevel) QAbstractTableModel::endResetModel(); - } } /*! \fn int QSqlQueryModel::rowCount(const QModelIndex &parent) const diff --git a/src/sql/models/qsqlquerymodel_p.h b/src/sql/models/qsqlquerymodel_p.h index 3288d311a4..70f72f393f 100644 --- a/src/sql/models/qsqlquerymodel_p.h +++ b/src/sql/models/qsqlquerymodel_p.h @@ -67,7 +67,7 @@ class QSqlQueryModelPrivate: public QAbstractItemModelPrivate { Q_DECLARE_PUBLIC(QSqlQueryModel) public: - QSqlQueryModelPrivate() : atEnd(false), resetting(false) {} + QSqlQueryModelPrivate() : atEnd(false), nestedResetLevel(0) {} ~QSqlQueryModelPrivate(); void prefetch(int); @@ -80,7 +80,7 @@ public: uint atEnd : 1; QVector<QHash<int, QVariant> > headers; QVarLengthArray<int, 56> colOffsets; // used to calculate indexInQuery of columns - bool resetting; + int nestedResetLevel; }; // helpers for building SQL expressions diff --git a/tests/auto/sql/models/qsqlquerymodel/tst_qsqlquerymodel.cpp b/tests/auto/sql/models/qsqlquerymodel/tst_qsqlquerymodel.cpp index 1c1319630e..582a76b119 100644 --- a/tests/auto/sql/models/qsqlquerymodel/tst_qsqlquerymodel.cpp +++ b/tests/auto/sql/models/qsqlquerymodel/tst_qsqlquerymodel.cpp @@ -91,6 +91,8 @@ private slots: void setQuerySignalEmission(); void setQueryWithNoRowsInResultSet_data() { generic_data(); } void setQueryWithNoRowsInResultSet(); + void nestedResets_data() { generic_data(); } + void nestedResets(); void task_180617(); void task_180617_data() { generic_data(); } @@ -585,6 +587,61 @@ void tst_QSqlQueryModel::setQueryWithNoRowsInResultSet() QCOMPARE(modelRowsInsertedSpy.count(), 0); } +class NestedResetsTest: public QSqlQueryModel +{ + Q_OBJECT + +public: + NestedResetsTest(QObject* parent = 0) : QSqlQueryModel(parent), gotAboutToBeReset(false), gotReset(false) + { + connect(this, SIGNAL(modelAboutToBeReset()), this, SLOT(modelAboutToBeResetSlot())); + connect(this, SIGNAL(modelReset()), this, SLOT(modelResetSlot())); + } + + void testme() + { + // Only the outermost beginResetModel/endResetModel should + // emit signals. + gotAboutToBeReset = gotReset = false; + beginResetModel(); + QCOMPARE(gotAboutToBeReset, true); + QCOMPARE(gotReset, false); + + gotAboutToBeReset = gotReset = false; + beginResetModel(); + QCOMPARE(gotAboutToBeReset, false); + QCOMPARE(gotReset, false); + + gotAboutToBeReset = gotReset = false; + endResetModel(); + QCOMPARE(gotAboutToBeReset, false); + QCOMPARE(gotReset, false); + + gotAboutToBeReset = gotReset = false; + endResetModel(); + QCOMPARE(gotAboutToBeReset, false); + QCOMPARE(gotReset, true); + } + +private slots: + void modelAboutToBeResetSlot() { gotAboutToBeReset = true; } + void modelResetSlot() { gotReset = true; } + +private: + bool gotAboutToBeReset; + bool gotReset; +}; + +void tst_QSqlQueryModel::nestedResets() +{ + QFETCH(QString, dbName); + QSqlDatabase db = QSqlDatabase::database(dbName); + CHECK_DATABASE(db); + + NestedResetsTest t; + t.testme(); +} + // For task 180617 // According to the task, several specific duplicate SQL queries would cause // multiple empty grid lines to be visible in the view |