281void QIdentityProxyModel::setSourceModel(QAbstractItemModel* newSourceModel)
283 Q_D(QIdentityProxyModel);
285 if (newSourceModel == d->model)
293 for (
const auto &c : d->m_sourceModelConnections)
294 QObject::disconnect(c);
296 QAbstractProxyModel::setSourceModel(newSourceModel);
299 auto *m = sourceModel();
300 d->m_sourceModelConnections = {
301 QObjectPrivate::connect(m, &QAbstractItemModel::rowsAboutToBeInserted, d,
302 &QIdentityProxyModelPrivate::sourceRowsAboutToBeInserted),
303 QObjectPrivate::connect(m, &QAbstractItemModel::rowsInserted, d,
304 &QIdentityProxyModelPrivate::sourceRowsInserted),
305 QObjectPrivate::connect(m, &QAbstractItemModel::rowsAboutToBeRemoved, d,
306 &QIdentityProxyModelPrivate::sourceRowsAboutToBeRemoved),
307 QObjectPrivate::connect(m, &QAbstractItemModel::rowsRemoved, d,
308 &QIdentityProxyModelPrivate::sourceRowsRemoved),
309 QObjectPrivate::connect(m, &QAbstractItemModel::rowsAboutToBeMoved, d,
310 &QIdentityProxyModelPrivate::sourceRowsAboutToBeMoved),
311 QObjectPrivate::connect(m, &QAbstractItemModel::rowsMoved, d,
312 &QIdentityProxyModelPrivate::sourceRowsMoved),
313 QObjectPrivate::connect(m, &QAbstractItemModel::columnsAboutToBeInserted, d,
314 &QIdentityProxyModelPrivate::sourceColumnsAboutToBeInserted),
315 QObjectPrivate::connect(m, &QAbstractItemModel::columnsInserted, d,
316 &QIdentityProxyModelPrivate::sourceColumnsInserted),
317 QObjectPrivate::connect(m, &QAbstractItemModel::columnsAboutToBeRemoved, d,
318 &QIdentityProxyModelPrivate::sourceColumnsAboutToBeRemoved),
319 QObjectPrivate::connect(m, &QAbstractItemModel::columnsRemoved, d,
320 &QIdentityProxyModelPrivate::sourceColumnsRemoved),
321 QObjectPrivate::connect(m, &QAbstractItemModel::columnsAboutToBeMoved, d,
322 &QIdentityProxyModelPrivate::sourceColumnsAboutToBeMoved),
323 QObjectPrivate::connect(m, &QAbstractItemModel::columnsMoved, d,
324 &QIdentityProxyModelPrivate::sourceColumnsMoved),
325 QObjectPrivate::connect(m, &QAbstractItemModel::modelAboutToBeReset, d,
326 &QIdentityProxyModelPrivate::sourceModelAboutToBeReset),
327 QObjectPrivate::connect(m, &QAbstractItemModel::modelReset, d,
328 &QIdentityProxyModelPrivate::sourceModelReset),
329 QObjectPrivate::connect(m, &QAbstractItemModel::headerDataChanged, d,
330 &QIdentityProxyModelPrivate::sourceHeaderDataChanged),
333 if (d->m_handleDataChanges) {
334 d->m_sourceModelConnections.emplace_back(
335 QObjectPrivate::connect(m, &QAbstractItemModel::dataChanged, d,
336 &QIdentityProxyModelPrivate::sourceDataChanged));
338 if (d->m_handleLayoutChanges) {
339 d->m_sourceModelConnections.emplace_back(
340 QObjectPrivate::connect(m, &QAbstractItemModel::layoutAboutToBeChanged, d,
341 &QIdentityProxyModelPrivate::sourceLayoutAboutToBeChanged));
342 d->m_sourceModelConnections.emplace_back(
343 QObjectPrivate::connect(m, &QAbstractItemModel::layoutChanged, d,
344 &QIdentityProxyModelPrivate::sourceLayoutChanged));
489void QIdentityProxyModelPrivate::sourceLayoutAboutToBeChanged(
490 const QList<QPersistentModelIndex> &sourceParents, QAbstractItemModel::LayoutChangeHint hint)
492 Q_Q(QIdentityProxyModel);
494 QList<QPersistentModelIndex> parents;
495 parents.reserve(sourceParents.size());
496 for (
const QPersistentModelIndex &parent : sourceParents) {
497 if (!parent.isValid()) {
498 parents << QPersistentModelIndex();
501 const QModelIndex mappedParent = q->mapFromSource(parent);
502 Q_ASSERT(mappedParent.isValid());
503 parents << mappedParent;
506 emit q->layoutAboutToBeChanged(parents, hint);
508 const auto proxyPersistentIndexes = q->persistentIndexList();
509 for (
const QModelIndex &proxyPersistentIndex : proxyPersistentIndexes) {
510 proxyIndexes << proxyPersistentIndex;
511 Q_ASSERT(proxyPersistentIndex.isValid());
512 const QPersistentModelIndex srcPersistentIndex = q->mapToSource(proxyPersistentIndex);
513 Q_ASSERT(srcPersistentIndex.isValid());
514 layoutChangePersistentIndexes << srcPersistentIndex;
518void QIdentityProxyModelPrivate::sourceLayoutChanged(
519 const QList<QPersistentModelIndex> &sourceParents, QAbstractItemModel::LayoutChangeHint hint)
521 Q_Q(QIdentityProxyModel);
523 for (
int i = 0; i < proxyIndexes.size(); ++i) {
524 q->changePersistentIndex(proxyIndexes.at(i), q->mapFromSource(layoutChangePersistentIndexes.at(i)));
527 layoutChangePersistentIndexes.clear();
528 proxyIndexes.clear();
530 QList<QPersistentModelIndex> parents;
531 parents.reserve(sourceParents.size());
532 for (
const QPersistentModelIndex &parent : sourceParents) {
533 if (!parent.isValid()) {
534 parents << QPersistentModelIndex();
537 const QModelIndex mappedParent = q->mapFromSource(parent);
538 Q_ASSERT(mappedParent.isValid());
539 parents << mappedParent;
542 emit q->layoutChanged(parents, hint);