diff --git a/src/core/scriptmodel.cpp b/src/core/scriptmodel.cpp index 259587c1..244ba9fe 100644 --- a/src/core/scriptmodel.cpp +++ b/src/core/scriptmodel.cpp @@ -12,6 +12,7 @@ #include void ScriptModel::updateValuesUnique(const QVariantList& newValues) { + this->hasActiveIterators = true; this->mValues.reserve(newValues.size()); auto iter = this->mValues.begin(); @@ -112,6 +113,8 @@ void ScriptModel::updateValuesUnique(const QVariantList& newValues) { ++newIter; } } + + this->hasActiveIterators = false; } void ScriptModel::setValues(const QVariantList& newValues) { diff --git a/src/core/scriptmodel.hpp b/src/core/scriptmodel.hpp index 10a42d6b..9bbf62d9 100644 --- a/src/core/scriptmodel.hpp +++ b/src/core/scriptmodel.hpp @@ -70,7 +70,13 @@ class ScriptModel: public QAbstractListModel { QML_ELEMENT; public: - [[nodiscard]] const QVariantList& values() const { return this->mValues; } + [[nodiscard]] QVariantList values() const { + auto values = this->mValues; + // If not detached, the QML engine will invalidate iterators in updateValuesUnique. + if (this->hasActiveIterators) values.detach(); + return values; + } + void setValues(const QVariantList& newValues); [[nodiscard]] qint32 rowCount(const QModelIndex& parent) const override; @@ -82,6 +88,7 @@ signals: private: QVariantList mValues; + bool hasActiveIterators = false; void updateValuesUnique(const QVariantList& newValues); };