Hi thanks for feedback,

I agree that putting everything in Component.onCompleted would be
worse workaround
than changing order but more explicit. On the other hand it is a lot
less declarative.

In my application I build different kinds of settings using list of objects or
strings. I encountered this issue while building list of Time Zones. The Item
that contained this list was instantiated in more than a second. Then I realized
that the function that creates and filters list is called twice. There are
numerous places in my application that uses function to initialize object
properties.

Moreover if I change tmp0 to: "property int tmp0: tmp1 + 1"
getTmp1Value is still called twice which seems like a bug.
AFAIK Qt knows dependencies between bindings because it triggers reevaluation
in dependent property has changed. Seems like this dependency is ignored during
initialization phase. Depending on complexity and duration of execution of
bindings expression instantiation of component can be almost twice longer
without any explicit cause.

Am I right or missing something?

2018-03-08 4:53 GMT+01:00 Jason H <jh...@gmx.com>:
>
> I can see your point. But tmp1 is not changing during the first property 
> init, so it won't be evaluated. The way to work around this order-specifc 
> init is to do it explicitly in a Component.onCompleted
>
> Sent: Wednesday, March 07, 2018 at 4:25 AM
> From: "Tomasz Olszak" <olszak.tom...@gmail.com>
> To: development@qt-project.org
> Subject: [Development] Is Qt Quick Item properties order significant?
> Hello,
>
> I'm writing here because I don't know if it is a bug or intended behavior and 
> I should look more carefully in docs (haven't found anything mentioning it 
> yet).
>
> Please consider 2 examples (can be pasted anywhere - you will see logs from 
> object initialization):
> Item {
>     property int tmp0: getTmp0Value(tmp1)
>     property int tmp1: getTmp1Value()
>     function getTmp1Value() {
>         console.log("getTmp1Value should be called only once and before 
> getTmp0Value");
>         return 1;
>     }
>     function getTmp0Value(arg) {
>         console.log("getTmp0Value should be called only once and aftere 
> getTmp1Value");
>         return arg + 1;
>     }
> }
>
> And with small modification (order of properties has changed):
> Item {
>    property int tmp1: getTmp1Value()
>    property int tmp0: getTmp0Value(tmp1)
>    ....
> }
>
>
> First one calls getTmp1Value twice, second one - as expected only once. Seems 
> like when tmp0 is initialized it does not initialize tmp1 first as dependency 
> but takes expression binding from tmp1 executes it and assign result to tmp0, 
> then executes the same expression for tmp1 to initialize it.
>
> Is it a bug or do I miss something?
>
> Tomek
>
>
> _______________________________________________ Development mailing list 
> Development@qt-project.org 
> http://lists.qt-project.org/mailman/listinfo/development
_______________________________________________
Development mailing list
Development@qt-project.org
http://lists.qt-project.org/mailman/listinfo/development

Reply via email to