summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/sql/models/qsqlquerymodel.cpp14
-rw-r--r--src/sql/models/qsqlquerymodel_p.h4
-rw-r--r--tests/auto/sql/models/qsqlquerymodel/tst_qsqlquerymodel.cpp57
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