diff options
-rw-r--r-- | src/qml/util/qqmladaptormodel.cpp | 6 | ||||
-rw-r--r-- | tests/auto/quick/qquicklistview/data/typedModel.qml | 23 | ||||
-rw-r--r-- | tests/auto/quick/qquicklistview/tst_qquicklistview.cpp | 20 |
3 files changed, 46 insertions, 3 deletions
diff --git a/src/qml/util/qqmladaptormodel.cpp b/src/qml/util/qqmladaptormodel.cpp index 9cd5709a49..38fdffdde6 100644 --- a/src/qml/util/qqmladaptormodel.cpp +++ b/src/qml/util/qqmladaptormodel.cpp @@ -902,7 +902,7 @@ void QQmlAdaptorModel::setModel(const QVariant &variant, QQmlDelegateModel *vdm, list.setList(variant, engine); - if (QObject *object = qvariant_cast<QObject *>(variant)) { + if (QObject *object = qvariant_cast<QObject *>(list.list())) { setObject(object); if (QAbstractItemModel *model = qobject_cast<QAbstractItemModel *>(object)) { accessors = new VDMAbstractItemModelDataType(this); @@ -927,8 +927,8 @@ void QQmlAdaptorModel::setModel(const QVariant &variant, QQmlDelegateModel *vdm, } else if (list.type() == QQmlListAccessor::ListProperty) { setObject(static_cast<const QQmlListReference *>(variant.constData())->object()); accessors = new VDMObjectDelegateDataType; - } else if (list.type() != QQmlListAccessor::Invalid) { - Q_ASSERT(list.type() != QQmlListAccessor::Instance); // Should have cast to QObject. + } else if (list.type() != QQmlListAccessor::Invalid + && list.type() != QQmlListAccessor::Instance) { // Null QObject setObject(0); accessors = &qt_vdm_list_accessors; } else { diff --git a/tests/auto/quick/qquicklistview/data/typedModel.qml b/tests/auto/quick/qquicklistview/data/typedModel.qml new file mode 100644 index 0000000000..d2b3f7e42f --- /dev/null +++ b/tests/auto/quick/qquicklistview/data/typedModel.qml @@ -0,0 +1,23 @@ +import QtQuick 2.0 + +ListView { + width: 100 + height: 100 + + delegate: Item { + width: 100 + height: 10 + } + model: listModel + + ListModel { + id: listModel + + ListElement { label: "a" } + ListElement { label: "b" } + ListElement { label: "c" } + ListElement { label: "d" } + ListElement { label: "e" } + ListElement { label: "f" } + } +} diff --git a/tests/auto/quick/qquicklistview/tst_qquicklistview.cpp b/tests/auto/quick/qquicklistview/tst_qquicklistview.cpp index f62151c2d8..6ec7cf8dc1 100644 --- a/tests/auto/quick/qquicklistview/tst_qquicklistview.cpp +++ b/tests/auto/quick/qquicklistview/tst_qquicklistview.cpp @@ -213,6 +213,8 @@ private slots: void outsideViewportChangeNotAffectingView(); void testProxyModelChangedAfterMove(); + void typedModel(); + private: template <class T> void items(const QUrl &source); template <class T> void changed(const QUrl &source); @@ -6960,6 +6962,24 @@ void tst_QQuickListView::testProxyModelChangedAfterMove() delete window; } +void tst_QQuickListView::typedModel() +{ + QQmlEngine engine; + QQmlComponent component(&engine, testFileUrl("typedModel.qml")); + + QScopedPointer<QObject> object(component.create()); + + QQuickListView *listview = qobject_cast<QQuickListView *>(object.data()); + QVERIFY(listview); + + QCOMPARE(listview->count(), 6); + + QQmlListModel *listModel = 0; + + listview->setModel(QVariant::fromValue(listModel)); + QCOMPARE(listview->count(), 0); +} + QTEST_MAIN(tst_QQuickListView) #include "tst_qquicklistview.moc" |