From 648d5964ee38b7ec6795c2397dd8dfcd0036656e Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Mon, 2 Jul 2012 17:11:18 +0200 Subject: [PATCH] Add a Q_PROPERTY for the sourceModel of a proxy model. Now that Q_PROPERTY with a QObject derived type is more powerful. This property can be used in QML so that wrappers for proxy models do not need to be created, such as in the example at https://codereview.qt-project.org/#change,13007 Change-Id: I6ba676549d2135585d429a28e214fef0b2a6b1f9 Reviewed-by: Olivier Goffart --- .../itemmodels/qabstractproxymodel.cpp | 19 +++++++++++-------- src/corelib/itemmodels/qabstractproxymodel.h | 4 ++++ .../tst_qabstractproxymodel.cpp | 10 ++++++++++ 3 files changed, 25 insertions(+), 8 deletions(-) diff --git a/src/corelib/itemmodels/qabstractproxymodel.cpp b/src/corelib/itemmodels/qabstractproxymodel.cpp index 69160043eaf..063bb0de8c5 100644 --- a/src/corelib/itemmodels/qabstractproxymodel.cpp +++ b/src/corelib/itemmodels/qabstractproxymodel.cpp @@ -122,16 +122,19 @@ QAbstractProxyModel::~QAbstractProxyModel() void QAbstractProxyModel::setSourceModel(QAbstractItemModel *sourceModel) { Q_D(QAbstractProxyModel); - if (d->model) - disconnect(d->model, SIGNAL(destroyed()), this, SLOT(_q_sourceModelDestroyed())); + if (sourceModel != d->model) { + if (d->model) + disconnect(d->model, SIGNAL(destroyed()), this, SLOT(_q_sourceModelDestroyed())); - if (sourceModel) { - d->model = sourceModel; - connect(d->model, SIGNAL(destroyed()), this, SLOT(_q_sourceModelDestroyed())); - } else { - d->model = QAbstractItemModelPrivate::staticEmptyModel(); + if (sourceModel) { + d->model = sourceModel; + connect(d->model, SIGNAL(destroyed()), this, SLOT(_q_sourceModelDestroyed())); + } else { + d->model = QAbstractItemModelPrivate::staticEmptyModel(); + } + d->roleNames = d->model->roleNames(); + emit sourceModelChanged(); } - d->roleNames = d->model->roleNames(); } /*! diff --git a/src/corelib/itemmodels/qabstractproxymodel.h b/src/corelib/itemmodels/qabstractproxymodel.h index d80fcb683ce..4dcbdfda500 100644 --- a/src/corelib/itemmodels/qabstractproxymodel.h +++ b/src/corelib/itemmodels/qabstractproxymodel.h @@ -57,6 +57,7 @@ class QItemSelection; class Q_CORE_EXPORT QAbstractProxyModel : public QAbstractItemModel { Q_OBJECT + Q_PROPERTY(QAbstractItemModel* sourceModel READ sourceModel WRITE setSourceModel NOTIFY sourceModelChanged) public: explicit QAbstractProxyModel(QObject *parent = 0); @@ -94,6 +95,9 @@ public: QStringList mimeTypes() const; Qt::DropActions supportedDropActions() const; +Q_SIGNALS: + void sourceModelChanged(); + protected: QAbstractProxyModel(QAbstractProxyModelPrivate &, QObject *parent); diff --git a/tests/auto/corelib/itemmodels/qabstractproxymodel/tst_qabstractproxymodel.cpp b/tests/auto/corelib/itemmodels/qabstractproxymodel/tst_qabstractproxymodel.cpp index 6d61f3f8324..4318721c601 100644 --- a/tests/auto/corelib/itemmodels/qabstractproxymodel/tst_qabstractproxymodel.cpp +++ b/tests/auto/corelib/itemmodels/qabstractproxymodel/tst_qabstractproxymodel.cpp @@ -283,15 +283,25 @@ void tst_QAbstractProxyModel::revert() // public void setSourceModel(QAbstractItemModel* sourceModel) void tst_QAbstractProxyModel::setSourceModel() { + qRegisterMetaType(); + SubQAbstractProxyModel model; + + QCOMPARE(model.property("sourceModel"), QVariant::fromValue(0)); QStandardItemModel *sourceModel = new QStandardItemModel(&model); model.setSourceModel(sourceModel); QCOMPARE(model.sourceModel(), static_cast(sourceModel)); + QCOMPARE(model.property("sourceModel").value(), static_cast(sourceModel)); + QCOMPARE(model.property("sourceModel").value(), sourceModel); + QStandardItemModel *sourceModel2 = new QStandardItemModel(&model); model.setSourceModel(sourceModel2); QCOMPARE(model.sourceModel(), static_cast(sourceModel2)); + QCOMPARE(model.property("sourceModel").value(), static_cast(sourceModel2)); + QCOMPARE(model.property("sourceModel").value(), sourceModel2); + delete sourceModel2; QCOMPARE(model.sourceModel(), static_cast(0)); }