[Interest] Dynamically created item destroyed with original parent despite reparenting

Elvis Stansvik elvstone at gmail.com
Sun Dec 20 17:44:38 CET 2015


2015-12-20 17:27 GMT+01:00 Peter Klosowski <kloffy at gmail.com>:
> Just to let you know, quick attempts to hack it such as...
>
> newParent.data[0] = target;
>
> ... or...
>
> newParent.data = [target];
>
> ... run without errors, but behavior is unchanged (i.e. the blue rectangle
> gets destroyed with oldParent).

Yea, I tried and got the same result. So strange, the docs clearly
speaks of assigning to the data property.

Elvis

>
>
> On Mon, Dec 21, 2015 at 2:13 AM, Peter Klosowski <kloffy at gmail.com> wrote:
>>
>>
>>
>> On Mon, Dec 21, 2015 at 2:03 AM, Elvis Stansvik <elvstone at gmail.com>
>> wrote:
>>>
>>> 2015-12-20 16:39 GMT+01:00 Peter Klosowski <kloffy at gmail.com>:
>>> > Unfortunately, the solution Elvis provided does not work for me.
>>> > Instead, I
>>> > get the following error:
>>> >
>>> > TypeError: Property 'push' of object [object Object] is not a function
>>> >
>>>
>>> Aha, I only tested it briefly in qmlviewer, so I didn't see those
>>> errors. So then it only seemingly worked for me.
>>
>>
>> No worries, it would have been awesome if the solution was that simple.
>>
>>>
>>> > Of course, that means the blue rectangle stays on the screen, but only
>>> > because the code after the error never gets executed (i.e. oldParent
>>> > never
>>> > gets destroyed).
>>> >
>>> > Nevertheless, I believe this would be the right track, if it is
>>> > possible at
>>> > all.
>>>
>>> Yes I think from the docs I found ("Any object assigned to an item's
>>> data property becomes a child of the item within its QObject hierarchy
>>> [...]"), it should be possible somehow. Question is how to do that
>>> assignment. Or perhaps the docs are a little misleading, and by
>>> "assignment" they simply mean declaring an item inside another, and
>>> there's no way to do this dynamically..? Would be kind of weird if it
>>> wasn't possible though.
>>
>>
>> I agree, that seems like a pretty glaring omission. Digging into the
>> sources (qt/qdeclarativelist.cpp), it appears that lists have a method for
>> appending items, but as far as I can tell it looks like it is not accessible
>> via QML. In the worst case, I could probably implement the newParent in C++
>> and wrap the call to append in a custom Q_INVOKABLE function. So at least I
>> have a contingency plan now...
>>
>>>
>>> Elvis
>>>
>>> >
>>> > Best regards,
>>> > kloffy
>>> >
>>> >
>>> > On Mon, Dec 21, 2015 at 1:28 AM, Peter Klosowski <kloffy at gmail.com>
>>> > wrote:
>>> >>
>>> >> Thank you all for your suggestions. This is an artificial example to
>>> >> illustrate the behavior that I am having problems with. I could also
>>> >> dynamically create the parent, that is not of relevance to my problem.
>>> >>
>>> >> On the other hand, the information that Elvis provided about the
>>> >> distinction between visual parent and QObject parents seems to hit the
>>> >> nail
>>> >> on the head. I will test and report back!
>>> >>
>>> >> Best regards,
>>> >> koffy
>>> >>
>>> >> On Mon, Dec 21, 2015 at 1:10 AM, Elvis Stansvik <elvstone at gmail.com>
>>> >> wrote:
>>> >>>
>>> >>> 2015-12-20 16:05 GMT+01:00 Personal Gmail
>>> >>> <siamak.rahimi.motem at gmail.com>:
>>> >>> > Hi Elvis ,
>>> >>> > Can we destroy() old parent which is not a component ? In other
>>> >>> > words,
>>> >>> > Is
>>> >>> > not the destroy only for component created dynamically ?
>>> >>> > I think oldParent.destory is problematic.
>>> >>>
>>> >>> Aha, now I see what you mean. I've never actually used QML myself,
>>> >>> and
>>> >>> didn't know this (and that setting transparency to 0 is actually the
>>> >>> recommended way to remove it from the visual scene hierarchy).
>>> >>>
>>> >>> But I think you're right, and that Peter should probably do that
>>> >>> instead, or otherwise make sure his old parent is created
>>> >>> dynamically.
>>> >>>
>>> >>> In any case, I tried
>>> >>>
>>> >>> newParent.data.push(target);
>>> >>>
>>> >>> and it seems to work, the blue rect remains. But I realize now that
>>> >>> .push is not documented in Qt 5 documentation
>>> >>> (http://doc.qt.io/qt-5/qml-list.html) so perhaps this is not
>>> >>> guaranteed to be supported. In the old 4.x docs, it says there are
>>> >>> limitations on .push (it'll only create a new list, not modify an
>>> >>> existing, but don't know if this holds for 5.x).
>>> >>>
>>> >>> Elvis
>>> >>>
>>> >>> >
>>> >>> > On 20 Dec 2015, at 17:02, Elvis Stansvik <elvstone at gmail.com>
>>> >>> > wrote:
>>> >>> >
>>> >>> > Elvis
>>> >>> >
>>> >>> >
>>> >>> _______________________________________________
>>> >>> Interest mailing list
>>> >>> Interest at qt-project.org
>>> >>> http://lists.qt-project.org/mailman/listinfo/interest
>>> >>
>>> >>
>>> >
>>> >
>>> > _______________________________________________
>>> > Interest mailing list
>>> > Interest at qt-project.org
>>> > http://lists.qt-project.org/mailman/listinfo/interest
>>> >
>>
>>
>



More information about the Interest mailing list