From 574ec248d65e4dddb12835a39d6620bafd0fce6e Mon Sep 17 00:00:00 2001 From: VRonin Date: Thu, 30 Apr 2020 09:28:53 +0100 Subject: [PATCH] Implementing a proxy model that does not change the tree structure of the original model should not require changing Qt internals. This new createIndex overload allows users of the public API to use the clever solution to this problem adopted by QIdentityProxyModel --- src/corelib/itemmodels/qabstractitemmodel.cpp | 18 ++++++++++++++++++ src/corelib/itemmodels/qabstractitemmodel.h | 8 ++++++-- src/corelib/itemmodels/qidentityproxymodel.cpp | 2 +- .../itemmodels/qtransposeproxymodel.cpp | 2 +- 4 files changed, 26 insertions(+), 4 deletions(-) diff --git a/src/corelib/itemmodels/qabstractitemmodel.cpp b/src/corelib/itemmodels/qabstractitemmodel.cpp index 3bc3b546d..57f254abb 100644 --- a/src/corelib/itemmodels/qabstractitemmodel.cpp +++ b/src/corelib/itemmodels/qabstractitemmodel.cpp @@ -2615,6 +2615,24 @@ bool QAbstractItemModel::setHeaderData(int section, Qt::Orientation orientation, \sa QModelIndex::internalId() */ +/*! + \fn QModelIndex QAbstractItemModel::createIndex(QAbstractItemModel* model, int row, int column, void *ptr) const + \since 6.0 + + Equivalent to \c{model->createIndex(row, column, ptr)}. + + This function allows easy creation of proxy models that don't alter the tree structure of the original model +*/ + +/*! + \fn QModelIndex QAbstractItemModel::createIndex(QAbstractItemModel* model, int row, int column, quintptr id) const + \since 6.0 + + Equivalent to \c{model->createIndex(row, column, id)}. + + This function allows easy creation of proxy models that don't alter the tree structure of the original model +*/ + /*! \internal */ diff --git a/src/corelib/itemmodels/qabstractitemmodel.h b/src/corelib/itemmodels/qabstractitemmodel.h index 86ff361cc..668ab6f3c 100644 --- a/src/corelib/itemmodels/qabstractitemmodel.h +++ b/src/corelib/itemmodels/qabstractitemmodel.h @@ -170,8 +170,6 @@ class Q_CORE_EXPORT QAbstractItemModel : public QObject friend class QPersistentModelIndexData; friend class QAbstractItemViewPrivate; - friend class QIdentityProxyModel; - friend class QTransposeProxyModelPrivate; public: explicit QAbstractItemModel(QObject *parent = nullptr); @@ -309,6 +307,8 @@ protected: inline QModelIndex createIndex(int row, int column, void *data = nullptr) const; inline QModelIndex createIndex(int row, int column, quintptr id) const; + inline QModelIndex createIndex(QAbstractItemModel* model, int row, int column, void *data = nullptr) const; + inline QModelIndex createIndex(QAbstractItemModel* model, int row, int column, quintptr id) const; void encodeData(const QModelIndexList &indexes, QDataStream &stream) const; bool decodeData(int row, int column, const QModelIndex &parent, QDataStream &stream); @@ -382,6 +382,10 @@ inline QModelIndex QAbstractItemModel::createIndex(int arow, int acolumn, void * { return QModelIndex(arow, acolumn, adata, this); } inline QModelIndex QAbstractItemModel::createIndex(int arow, int acolumn, quintptr aid) const { return QModelIndex(arow, acolumn, aid, this); } +inline QModelIndex QAbstractItemModel::createIndex(AbstractItemModel* model, int arow, int acolumn, void *adata) const +{ return model->createIndex(arow, acolumn, adata); } +inline QModelIndex QAbstractItemModel::createIndex(AbstractItemModel* model, int arow, int acolumn, quintptr aid) const +{ return model->createIndex(arow, acolumn, aid); } class Q_CORE_EXPORT QAbstractTableModel : public QAbstractItemModel { diff --git a/src/corelib/itemmodels/qidentityproxymodel.cpp b/src/corelib/itemmodels/qidentityproxymodel.cpp index 8210e27f8..af0436105 100644 --- a/src/corelib/itemmodels/qidentityproxymodel.cpp +++ b/src/corelib/itemmodels/qidentityproxymodel.cpp @@ -257,7 +257,7 @@ QModelIndex QIdentityProxyModel::mapToSource(const QModelIndex& proxyIndex) cons if (!d->model || !proxyIndex.isValid()) return QModelIndex(); Q_ASSERT(proxyIndex.model() == this); - return d->model->createIndex(proxyIndex.row(), proxyIndex.column(), proxyIndex.internalPointer()); + return createIndex(d->model, proxyIndex.row(), proxyIndex.column(), proxyIndex.internalPointer()); } /*! diff --git a/src/corelib/itemmodels/qtransposeproxymodel.cpp b/src/corelib/itemmodels/qtransposeproxymodel.cpp index 207faa615..bce4a1a34 100644 --- a/src/corelib/itemmodels/qtransposeproxymodel.cpp +++ b/src/corelib/itemmodels/qtransposeproxymodel.cpp @@ -50,7 +50,7 @@ QModelIndex QTransposeProxyModelPrivate::uncheckedMapToSource(const QModelIndex if (!model || !proxyIndex.isValid()) return QModelIndex(); if (proxyIndex.internalPointer()) - return model->createIndex(proxyIndex.column(), proxyIndex.row(), proxyIndex.internalPointer()); + return createIndex(d->model, proxyIndex.column(), proxyIndex.row(), proxyIndex.internalPointer()); return model->index(proxyIndex.column(), proxyIndex.row()); } -- 2.26.1.windows.1