From 9d8663c18e88cb0b5a65f86cfd7726f3d31e04d6 Mon Sep 17 00:00:00 2001 From: Mitch Curtis Date: Tue, 24 Sep 2024 10:40:37 +0800 Subject: [PATCH] QAbstractItemModelPrivate: add resetting member This allows QQmlDelegateModel to know if a QAbstractItemModel subclass is in the process of a reset, which it can't know if beginResetModel was called in the model's constructor. As an added bonus, it also allows us to warn the user if they call endResetModel with a previous call to beginResetModel. Task-number: QTBUG-125053 Task-number: QTBUG-127340 Pick-to: 6.5 6.7 6.8 Change-Id: I7d1fb983e9bf868c48472624ad945ae158115943 Reviewed-by: Richard Moe Gustavsen --- src/corelib/itemmodels/qabstractitemmodel.cpp | 13 +++++++++++++ src/corelib/itemmodels/qabstractitemmodel_p.h | 4 ++++ 2 files changed, 17 insertions(+) diff --git a/src/corelib/itemmodels/qabstractitemmodel.cpp b/src/corelib/itemmodels/qabstractitemmodel.cpp index 416bd4f6b43..df944296293 100644 --- a/src/corelib/itemmodels/qabstractitemmodel.cpp +++ b/src/corelib/itemmodels/qabstractitemmodel.cpp @@ -3401,7 +3401,14 @@ void QAbstractItemModel::endMoveColumns() */ void QAbstractItemModel::beginResetModel() { + Q_D(QAbstractItemModel); + if (d->resetting) { + qWarning() << "beginResetModel called on" << this << "without calling endResetModel first"; + // Warn, but don't return early in case user code relies on the incorrect behavior. + } + qCDebug(lcReset) << "beginResetModel called; about to emit modelAboutToBeReset"; + d->resetting = true; emit modelAboutToBeReset(QPrivateSignal()); } @@ -3419,9 +3426,15 @@ void QAbstractItemModel::beginResetModel() void QAbstractItemModel::endResetModel() { Q_D(QAbstractItemModel); + if (!d->resetting) { + qWarning() << "endResetModel called on" << this << "without calling beginResetModel first"; + // Warn, but don't return early in case user code relies on the incorrect behavior. + } + qCDebug(lcReset) << "endResetModel called; about to emit modelReset"; d->invalidatePersistentIndexes(); resetInternalData(); + d->resetting = false; emit modelReset(QPrivateSignal()); } diff --git a/src/corelib/itemmodels/qabstractitemmodel_p.h b/src/corelib/itemmodels/qabstractitemmodel_p.h index e34dc3262cf..c2113fde9aa 100644 --- a/src/corelib/itemmodels/qabstractitemmodel_p.h +++ b/src/corelib/itemmodels/qabstractitemmodel_p.h @@ -45,6 +45,8 @@ class Q_CORE_EXPORT QAbstractItemModelPrivate : public QObjectPrivate QAbstractItemModelPrivate(); ~QAbstractItemModelPrivate(); + static const QAbstractItemModelPrivate *get(const QAbstractItemModel *model) { return model->d_func(); } + void removePersistentIndexData(QPersistentModelIndexData *data); void movePersistentIndexes(const QList &indexes, int change, const QModelIndex &parent, Qt::Orientation orientation); @@ -115,6 +117,8 @@ class Q_CORE_EXPORT QAbstractItemModelPrivate : public QObjectPrivate void insertMultiAtEnd(const QModelIndex& key, QPersistentModelIndexData *data); } persistent; + bool resetting = false; + static const QHash &defaultRoleNames(); static bool isVariantLessThan(const QVariant &left, const QVariant &right, Qt::CaseSensitivity cs = Qt::CaseSensitive, bool isLocaleAware = false);