summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMark Brand <mabrand@mabrand.nl>2012-08-29 09:34:41 +0200
committerQt by Nokia <qt-info@nokia.com>2012-08-30 13:51:22 +0200
commitc194b7f3454f470d24be729ef660c5cfe7a9b841 (patch)
tree467b19df91b6a463ea8064c5e92a0bf07189500b /src
parent98c663acd955ed7f0afcaffc50e738690fbb94ae (diff)
QSqlQueryModel: fix nested beginResetModel/endResetModel
Follow-up to 83c9ebbd6692cde99ee692e6549c591100f12545. Consider the case where calls to the reset methods on the same object are nested as in the following sequence: 1. beginResetModel() 2. beginResetModel() 3. endResetModel() 4. endResetModel() In such cases, only the outermost calls, i.e., 1) and 4), should emit signals. After 83c9ebbd6692cde99ee692e6549c591100f12545, 1) and 3) emitted the signals, which is wrong. This is corrected by keeping track of the nesting level. Such sequences can come about when a base class calls the begin/end methods between the calls made by the subclass. QSqlTableModel::select() is an example of this. Test included. Change-Id: Ia62b45cb1abaab00a32bb8357de4a958bcff83e5 Reviewed-by: Andy Shaw <andy.shaw@digia.com> Reviewed-by: Olivier Goffart <ogoffart@woboq.com>
Diffstat (limited to 'src')
-rw-r--r--src/sql/models/qsqlquerymodel.cpp14
-rw-r--r--src/sql/models/qsqlquerymodel_p.h4
2 files changed, 8 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