341QMimeData *QConcatenateTablesProxyModel::mimeData(
const QModelIndexList &indexes)
const
343 Q_D(
const QConcatenateTablesProxyModel);
344 if (indexes.isEmpty())
346 const QModelIndex firstIndex = indexes.first();
347 Q_ASSERT(checkIndex(firstIndex, CheckIndexOption::IndexIsValid));
348 const auto result = d->sourceModelForRow(firstIndex.row());
349 QModelIndexList sourceIndexes;
350 sourceIndexes.reserve(indexes.size());
351 for (
const QModelIndex &index : indexes) {
352 const QModelIndex sourceIndex = mapToSource(index);
353 Q_ASSERT(sourceIndex.model() == result.sourceModel);
354 sourceIndexes.append(sourceIndex);
356 return result.sourceModel->mimeData(sourceIndexes);
469void QConcatenateTablesProxyModel::addSourceModel(QAbstractItemModel *sourceModel)
471 Q_D(QConcatenateTablesProxyModel);
472 Q_ASSERT(sourceModel);
473 Q_ASSERT(!d->containsSourceModel(sourceModel));
475 const int newRows = sourceModel->rowCount();
477 beginInsertRows(QModelIndex(), d->m_rowCount, d->m_rowCount + newRows - 1);
478 d->m_rowCount += newRows;
479 d->m_models.emplace_back(sourceModel, std::array{
480 QObjectPrivate::connect(sourceModel, &QAbstractItemModel::dataChanged,
481 d, &QConcatenateTablesProxyModelPrivate::slotDataChanged),
482 QObjectPrivate::connect(sourceModel, &QAbstractItemModel::rowsInserted,
483 d, &QConcatenateTablesProxyModelPrivate::slotRowsInserted),
484 QObjectPrivate::connect(sourceModel, &QAbstractItemModel::rowsRemoved,
485 d, &QConcatenateTablesProxyModelPrivate::slotRowsRemoved),
486 QObjectPrivate::connect(sourceModel, &QAbstractItemModel::rowsAboutToBeInserted,
487 d, &QConcatenateTablesProxyModelPrivate::slotRowsAboutToBeInserted),
488 QObjectPrivate::connect(sourceModel, &QAbstractItemModel::rowsAboutToBeRemoved,
489 d, &QConcatenateTablesProxyModelPrivate::slotRowsAboutToBeRemoved),
490 QObjectPrivate::connect(sourceModel, &QAbstractItemModel::rowsMoved,
491 d, &QConcatenateTablesProxyModelPrivate::slotRowsMoved),
492 QObjectPrivate::connect(sourceModel, &QAbstractItemModel::rowsAboutToBeMoved,
493 d, &QConcatenateTablesProxyModelPrivate::slotRowsAboutToBeMoved),
495 QObjectPrivate::connect(sourceModel, &QAbstractItemModel::columnsInserted,
496 d, &QConcatenateTablesProxyModelPrivate::slotColumnsInserted),
497 QObjectPrivate::connect(sourceModel, &QAbstractItemModel::columnsRemoved,
498 d, &QConcatenateTablesProxyModelPrivate::slotColumnsRemoved),
499 QObjectPrivate::connect(sourceModel, &QAbstractItemModel::columnsAboutToBeInserted,
500 d, &QConcatenateTablesProxyModelPrivate::slotColumnsAboutToBeInserted),
501 QObjectPrivate::connect(sourceModel, &QAbstractItemModel::columnsAboutToBeRemoved,
502 d, &QConcatenateTablesProxyModelPrivate::slotColumnsAboutToBeRemoved),
503 QObjectPrivate::connect(sourceModel, &QAbstractItemModel::columnsMoved,
504 d, &QConcatenateTablesProxyModelPrivate::slotColumnsMoved),
505 QObjectPrivate::connect(sourceModel, &QAbstractItemModel::columnsAboutToBeMoved,
506 d, &QConcatenateTablesProxyModelPrivate::slotColumnsAboutToBeMoved),
508 QObjectPrivate::connect(sourceModel, &QAbstractItemModel::layoutAboutToBeChanged,
509 d, &QConcatenateTablesProxyModelPrivate::slotSourceLayoutAboutToBeChanged),
510 QObjectPrivate::connect(sourceModel, &QAbstractItemModel::layoutChanged,
511 d, &QConcatenateTablesProxyModelPrivate::slotSourceLayoutChanged),
512 QObjectPrivate::connect(sourceModel, &QAbstractItemModel::modelAboutToBeReset,
513 d, &QConcatenateTablesProxyModelPrivate::slotModelAboutToBeReset),
514 QObjectPrivate::connect(sourceModel, &QAbstractItemModel::modelReset,
515 d, &QConcatenateTablesProxyModelPrivate::slotModelReset),
517 if (!d->m_roleNamesDirty) {
519 const auto newRoleNames = sourceModel->roleNames();
520 for (
const auto &[k, v] : newRoleNames.asKeyValueRange())
521 d->m_roleNames.insert_or_assign(k, v);
526 d->updateColumnCount();
750 const QList<QPersistentModelIndex> &sourceParents, QAbstractItemModel::LayoutChangeHint hint)
752 Q_Q(QConcatenateTablesProxyModel);
754 if (!sourceParents.isEmpty() && !sourceParents.contains(QModelIndex()))
757 emit q->layoutAboutToBeChanged({}, hint);
759 const QModelIndexList persistentIndexList = q->persistentIndexList();
760 layoutChangePersistentIndexes.reserve(persistentIndexList.size());
761 layoutChangeProxyIndexes.reserve(persistentIndexList.size());
763 for (
const QModelIndex &proxyPersistentIndex : persistentIndexList) {
764 layoutChangeProxyIndexes.append(proxyPersistentIndex);
765 Q_ASSERT(proxyPersistentIndex.isValid());
766 const QPersistentModelIndex srcPersistentIndex = q->mapToSource(proxyPersistentIndex);
767 Q_ASSERT(srcPersistentIndex.isValid());
768 layoutChangePersistentIndexes << srcPersistentIndex;