[Interest] Strange binding behavior when using binding on array's element

geniuss geniuss at ukr.net
Wed Jul 22 11:09:41 CEST 2015


I have an|Item|with a property. This property contains an array of 
JavaScript objects which in turn contain other properties.
When I set binding for one of object's properties to some variable and 
its (variable) value changes triggering the binding then all properties 
in the array are reset to their initial values. I've created a small 
demo to show the problem.

C++ code:

|// main.cpp
#include <QGuiApplication>
#include <QQuickWindow>
#include <QQmlApplicationEngine>
#include <QQmlContext>

class Test : public QObject
{

     Q_OBJECT
         Q_PROPERTY(QString emptyString READ getEmptyString NOTIFY valueChanged)
         QString getEmptyString(){ return ""; }

public:
     Test(QObject* parent = 0) : QObject(parent) {}

     Q_INVOKABLE void triggerNotify()
     {
         valueChanged();
     }

signals:
     void valueChanged();
};

int main(int argc, char *argv[])
{
     QGuiApplication app(argc, argv);
     
     QQmlApplicationEngine engine;
     Test* test = new Test(&engine);
     engine.rootContext()->setContextProperty("__test__", (QObject*)test);
     QObject::connect(&engine, &QQmlApplicationEngine::objectCreated, [](QObject* rootObject) {
         QQuickWindow *appWindow = qobject_cast<QQuickWindow *>(rootObject);
         appWindow->show();
     });

     engine.load(QUrl(QStringLiteral("qrc:/ui/main.qml")));
     return app.exec();
}|

QML code:

|// main.qml
import  QtQuick  2.4
import  QtQuick.Controls  1.3

ApplicationWindow  {
     id:  container
     visible:  true

     width:  640
     height:  480

     property  int  clicksCounter:  0

     Item  {
         id:  testObject
         property  var myArray:  [{
             name:  "CustomName"  +  __test__.value,
             boolFlag:  false
         }]
     }

     Rectangle  {
         x:  10
         y:  10

         width:  100
         height:  100
         color:  "red"

         MouseArea  {
             anchors.fill:  parent
             onClicked:  {
                 container.clicksCounter++

                 console.log("CLICK #"  +  container.clicksCounter+  "[RED SQUARE] : Set testObject.myArray[0] to TRUE\n")
                 testObject.myArray[0].boolFlag=  true
                 console.log("CLICK #"  +  container.clicksCounter+  "[RED SQUARE] : DONE\n")
             }
         }
     }

     Rectangle  {
         x:  120
         y:  10

         width:  100
         height:  100
         color:  "blue"

         MouseArea  {
             anchors.fill:  parent
             onClicked:  {
                 container.clicksCounter++

                 console.log("CLICK #"  +  container.clicksCounter+  "[BLUE SQUARE] : Triggering notify by calling C++ <Test::valueChanged> method \n")
                 console.log("CLICK #"  +  container.clicksCounter+  "[BLUE SQUARE] : [BEFORE] testObject.myArray[0].name:"  +  testObject.myArray[0].name+  ', testObject.myArray[0].boolFlag:'  +  testObject.myArray[0].boolFlag)
                 __test__.valueChanged()
                 console.log("CLICK #"  +  container.clicksCounter+  "[BLUE SQUARE] : [AFTER] testObject.myArray[0].name:"  +  testObject.myArray[0].name+  ', testObject.myArray[0].boolFlag:'  +  testObject.myArray[0].boolFlag)
             }
         }
     }
}|


Here is what I get:

qml: CLICK #1[RED SQUARE] : Set testObject.myArray[0] to TRUE
qml: CLICK #1[RED SQUARE] : DONE

qml: CLICK #2[BLUE SQUARE] : Triggering notify by calling C++ 
<Test::triggerNotify> method

qml: CLICK #2[BLUE SQUARE] : [BEFORE] testObject.myArray[0].name: 
CustomName, testObject.myArray[0].boolFlag: true
qml: CLICK #2[BLUE SQUARE] : [AFTER] testObject.myArray[0].name: 
CustomName, testObject.myArray[0].boolFlag: false

So what happens here is that after I set testObject.myArray[0].boolFlag 
from FALSE to TRUE and call test.triggerNotify() method my flag 
automatically resets to its initial value. Same goes if any other type 
used - int, string, etc. Why does this happen?

[UPDATE] QT 5.5 is used, Visual Studio 2013 Update 4 x32.

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.qt-project.org/pipermail/interest/attachments/20150722/f5ae77d7/attachment.html>


More information about the Interest mailing list