[Development] Is Qt Quick Item properties order significant?

Tomasz Olszak olszak.tomasz at gmail.com
Thu Mar 8 08:25:32 CET 2018


The same behavior is when tmp1 is initialized with C++ function.
Function is called twice too.

2018-03-08 8:15 GMT+01:00 Tomasz Olszak <olszak.tomasz at gmail.com>:
> 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 <jhihn at 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.tomasz at gmail.com>
>> To: development at 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 at qt-project.org http://lists.qt-project.org/mailman/listinfo/development



More information about the Development mailing list