core/scriptmodel: detatch mValues when accessed during update
Fixes iterator invalidation caused by the QML engine.
This commit is contained in:
parent
3a97da0029
commit
ed528268e0
2 changed files with 11 additions and 1 deletions
|
@ -12,6 +12,7 @@
|
|||
#include <qvariant.h>
|
||||
|
||||
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) {
|
||||
|
|
|
@ -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);
|
||||
};
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue