diff options
3 files changed, 26 insertions, 9 deletions
diff --git a/src/corelib/itemmodels/qabstractproxymodel.cpp b/src/corelib/itemmodels/qabstractproxymodel.cpp index 69160043ea..063bb0de8c 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 = sourceModel; - connect(d->model, SIGNAL(destroyed()), this, SLOT(_q_sourceModelDestroyed())); - } else { - d->model = QAbstractItemModelPrivate::staticEmptyModel(); + 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(); + } + 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 d80fcb683c..4dcbdfda50 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 6d61f3f832..4318721c60 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<QAbstractItemModel*>(); + SubQAbstractProxyModel model; + + QCOMPARE(model.property("sourceModel"), QVariant::fromValue<QAbstractItemModel*>(0)); QStandardItemModel *sourceModel = new QStandardItemModel(&model); model.setSourceModel(sourceModel); QCOMPARE(model.sourceModel(), static_cast<QAbstractItemModel*>(sourceModel)); + QCOMPARE(model.property("sourceModel").value<QObject*>(), static_cast<QObject*>(sourceModel)); + QCOMPARE(model.property("sourceModel").value<QAbstractItemModel*>(), sourceModel); + QStandardItemModel *sourceModel2 = new QStandardItemModel(&model); model.setSourceModel(sourceModel2); QCOMPARE(model.sourceModel(), static_cast<QAbstractItemModel*>(sourceModel2)); + QCOMPARE(model.property("sourceModel").value<QObject*>(), static_cast<QObject*>(sourceModel2)); + QCOMPARE(model.property("sourceModel").value<QAbstractItemModel*>(), sourceModel2); + delete sourceModel2; QCOMPARE(model.sourceModel(), static_cast<QAbstractItemModel*>(0)); } |