** Description changed: This is the cause for the Sections index resetting after initialization, see bug 1610231. - Create the file ModelTest.qml: - + Use this code: + ------ ModelFromList13.qml ------ import QtQuick 2.4 + // This component is used in tst_listview_bug1621509.13.qml Item { - id: root - width: 800 - height: 600 + id: root + property var myObject + property int count: 0 // will hold the number of changes to myObject after Component.completed. - ListView { - model: root.model - onModelChanged: print("LV model changed to "+model[0]+" "+model[1]+" "+model[2]+" "+model[3]) - Component.onCompleted: print("ListView completed.") - } - Component.onCompleted: print("root item completed.") - - property list<QtObject> objectList - onObjectListChanged: print("root.objectList changed to "+objectList[0]+" "+objectList[1]+" "+objectList[2]) - property var model: objectList + onMyObjectChanged: { + print("myObject changed to "+myObject) + count++; + } + Component.onCompleted: { + count = 0; + } } - And run this program modelInst.qml: + ------ tst_list_model_from_list_bug1621509.13.qml ------ + import QtQuick 2.4 + import QtTest 1.0 - import QtQuick 2.4 + // Ubuntu.Components is not explicitly used below, but its import causes bug #1621509. import Ubuntu.Components 1.3 - ModelTest { - QtObject { - objectName: "one" - id: objectOne - } - QtObject { - objectName: "two" - id: objectTwo - } - QtObject{ - objectName: "three" - id: objectThree - } + TestCase { + id: testCase + name: "EmbeddedListView" + width: 100 + height: 100 - objectList: [objectOne, objectTwo, objectThree] + // Bug #1621509 only occurs when we wait for the window to be visible. + // Forces the components to be completed before the test functions are executed. + when: windowShown + + ModelFromList13 { + id: embeddedListView + QtObject { + objectName: "one" + id: objectOne + } + myObject: objectOne + } + + Component.onCompleted: { + print("Component completed."); // must print something to reproduce the bug. + } + + function test_no_model_change_after_completed_bug1621509_bug1610231() { + compare(embeddedListView.count, 0, + "The model was changed after the component was completed."); + } } + ---------- - The output is as follows: - - $ qmlscene modelInst.qml - qml: root.objectList changed to undefined undefined undefined - qml: root.objectList changed to QObject(0x118abf0, "one") undefined undefined - qml: root.objectList changed to QObject(0x118abf0, "one") QObject(0x118a110, "two") undefined - qml: root.objectList changed to QObject(0x118abf0, "one") QObject(0x118a110, "two") QObject(0x1182f80, "three") - qml: LV model changed to QObject(0x118abf0, "one") QObject(0x118a110, "two") QObject(0x1182f80, "three") undefined - qml: LV model changed to QObject(0x118abf0, "one") QObject(0x118a110, "two") QObject(0x1182f80, "three") undefined - qml: root item completed. - qml: ListView completed. - qml: LV model changed to QObject(0x118abf0, "one") QObject(0x118a110, "two") QObject(0x1182f80, "three") undefined - qml: LV model changed to QObject(0x118abf0, "one") QObject(0x118a110, "two") QObject(0x1182f80, "three") undefined - - So the model is changed AFTER the ListView and root item are completed. - - When the Ubuntu.Components import is removed the output is correct: - - $ qmlscene modelInst.qml - qml: root.objectList changed to undefined undefined undefined - qml: root.objectList changed to QObject(0x171c8d0, "one") undefined undefined - qml: root.objectList changed to QObject(0x171c8d0, "one") QObject(0x171d290, "two") undefined - qml: root.objectList changed to QObject(0x171c8d0, "one") QObject(0x171d290, "two") QObject(0x171d420, "three") - qml: LV model changed to QObject(0x171c8d0, "one") QObject(0x171d290, "two") QObject(0x171d420, "three") undefined - qml: LV model changed to QObject(0x171c8d0, "one") QObject(0x171d290, "two") QObject(0x171d420, "three") undefined - qml: root item completed. - qml: ListView completed. - - Also, if there is no ListView inside ModelTest.qml, then nothing is - updated after the items are completed. So I suspect the issue is in our - ListView extension. + the test will fail. Also, one can replace the TestCase by Item (and + remove when: windowShown) and simply use qmlscene to start the app. It + will show that myObject is set twice: before the component completed, + and then again afterwards. I suspect the reason for this is the change + of the 'window' context property which causes everything in the context + (objectOne) and properties that depend on that to be re-evaluated.
-- You received this bug notification because you are a member of Ubuntu Touch seeded packages, which is subscribed to ubuntu-ui-toolkit in Ubuntu. https://bugs.launchpad.net/bugs/1621509 Title: 'window' contextProperty is registered after components are completed Status in ubuntu-ui-toolkit package in Ubuntu: In Progress Bug description: This is the cause for the Sections index resetting after initialization, see bug 1610231. Use this code: ------ ModelFromList13.qml ------ import QtQuick 2.4 // This component is used in tst_listview_bug1621509.13.qml Item { id: root property var myObject property int count: 0 // will hold the number of changes to myObject after Component.completed. onMyObjectChanged: { print("myObject changed to "+myObject) count++; } Component.onCompleted: { count = 0; } } ------ tst_list_model_from_list_bug1621509.13.qml ------ import QtQuick 2.4 import QtTest 1.0 // Ubuntu.Components is not explicitly used below, but its import causes bug #1621509. import Ubuntu.Components 1.3 TestCase { id: testCase name: "EmbeddedListView" width: 100 height: 100 // Bug #1621509 only occurs when we wait for the window to be visible. // Forces the components to be completed before the test functions are executed. when: windowShown ModelFromList13 { id: embeddedListView QtObject { objectName: "one" id: objectOne } myObject: objectOne } Component.onCompleted: { print("Component completed."); // must print something to reproduce the bug. } function test_no_model_change_after_completed_bug1621509_bug1610231() { compare(embeddedListView.count, 0, "The model was changed after the component was completed."); } } ---------- the test will fail. Also, one can replace the TestCase by Item (and remove when: windowShown) and simply use qmlscene to start the app. It will show that myObject is set twice: before the component completed, and then again afterwards. I suspect the reason for this is the change of the 'window' context property which causes everything in the context (objectOne) and properties that depend on that to be re- evaluated. To manage notifications about this bug go to: https://bugs.launchpad.net/ubuntu/+source/ubuntu-ui-toolkit/+bug/1621509/+subscriptions -- Mailing list: https://launchpad.net/~touch-packages Post to : touch-packages@lists.launchpad.net Unsubscribe : https://launchpad.net/~touch-packages More help : https://help.launchpad.net/ListHelp