Skip to content

Commit

Permalink
Fix QDeclarativeListProperty assignment
Browse files Browse the repository at this point in the history
This commit ensures that a QDeclarativeListReference can be
assigned to another QDeclarativeListProperty, by retrieving
each element in the list reference and converting to the appropriate
type before appending to the target list property.

Task-number: QTBUG-16316
Change-Id: Id8858058f052a53bf43eadc085fd278654478d77
Reviewed-on: http://codereview.qt-project.org/4388
Reviewed-by: Qt Sanity Bot <qt_sanity_bot@ovi.com>
Reviewed-by: Aaron Kennedy <aaron.kennedy@nokia.com>
  • Loading branch information
Chris Adams authored and Qt by Nokia committed Sep 19, 2011
1 parent 1aa075b commit 85554f7
Show file tree
Hide file tree
Showing 3 changed files with 46 additions and 1 deletion.
11 changes: 10 additions & 1 deletion src/declarative/qml/qdeclarativeproperty.cpp
Expand Up @@ -1215,7 +1215,16 @@ bool QDeclarativePropertyPrivate::write(QObject *object, const QDeclarativePrope

prop.clear(&prop);

if (value.userType() == qMetaTypeId<QList<QObject *> >()) {
if (value.userType() == qMetaTypeId<QDeclarativeListReference>()) {
QDeclarativeListReference qdlr = value.value<QDeclarativeListReference>();

for (int ii = 0; ii < qdlr.count(); ++ii) {
QObject *o = qdlr.at(ii);
if (o && !canConvert(o->metaObject(), listType))
o = 0;
prop.append(&prop, (void *)o);
}
} else if (value.userType() == qMetaTypeId<QList<QObject *> >()) {
const QList<QObject *> &list = qvariant_cast<QList<QObject *> >(value);

for (int ii = 0; ii < list.count(); ++ii) {
Expand Down
@@ -0,0 +1,20 @@
import QtQuick 2.0
import Qt.test 1.0

Item {
id: root
width: 640
height: 480

property int list1length: list1.length

property list<MyQmlObject> list1
property list<MyQmlObject> list2: [
MyQmlObject { id: one; value: 100 },
MyQmlObject { id: two; value: 300 }
]

Component.onCompleted: {
root.list1 = root.list2;
}
}
Expand Up @@ -131,6 +131,7 @@ private slots:
void jsObject();
void undefinedResetsProperty();
void listToVariant();
void listAssignment();
void multiEngineObject();
void deletedObject();
void attachedPropertyScope();
Expand Down Expand Up @@ -2233,6 +2234,21 @@ void tst_qdeclarativeecmascript::listToVariant()
delete object;
}

// QTBUG-16316
Q_DECLARE_METATYPE(QDeclarativeListProperty<MyQmlObject>)
void tst_qdeclarativeecmascript::listAssignment()
{
QDeclarativeComponent component(&engine, TEST_FILE("listAssignment.qml"));
QObject *obj = component.create();
QCOMPARE(obj->property("list1length").toInt(), 2);
QDeclarativeListProperty<MyQmlObject> list1 = obj->property("list1").value<QDeclarativeListProperty<MyQmlObject> >();
QDeclarativeListProperty<MyQmlObject> list2 = obj->property("list2").value<QDeclarativeListProperty<MyQmlObject> >();
QCOMPARE(list1.count(&list1), list2.count(&list2));
QCOMPARE(list1.at(&list1, 0), list2.at(&list2, 0));
QCOMPARE(list1.at(&list1, 1), list2.at(&list2, 1));
delete obj;
}

// QTBUG-7957
void tst_qdeclarativeecmascript::multiEngineObject()
{
Expand Down

0 comments on commit 85554f7

Please sign in to comment.