+ if (index < 0 || index >= count() || !item) {
+ delete item;
+ return;
+ }
+
+ item->m_model = this;
+
+ QSet<QByteArray> changedRoles;
+
+ KStandardItem* oldItem = m_items[index];
+ const QHash<QByteArray, QVariant> oldData = oldItem->data();
+ const QHash<QByteArray, QVariant> newData = item->data();
+
+ // Determine which roles have been changed
+ QHashIterator<QByteArray, QVariant> it(oldData);
+ while (it.hasNext()) {
+ it.next();
+ const QByteArray role = it.key();
+ const QVariant oldValue = it.value();
+ if (newData.contains(role) && newData.value(role) != oldValue) {
+ changedRoles.insert(role);
+ }
+ }
+
+ m_indexesForItems.remove(oldItem);
+ delete oldItem;
+ oldItem = nullptr;
+
+ m_items[index] = item;
+ m_indexesForItems.insert(item, index);
+
+ onItemChanged(index, changedRoles);
+ emit itemsChanged(KItemRangeList() << KItemRange(index, 1), changedRoles);