Re: [Interest] 5.5/5.6 QMLEngine management

2016-01-11 Thread m...@rpzdesign.com

On 1/11/2016 12:53 AM, Bo Thorsen wrote:

Den 10-01-2016 kl. 03:21 skrev mark diener:

Hello List:

I have a couple of core QMLEngine questions:

Basic Code Snippet:

QQmlEngine geng ;

QQmlComponent gcomp()
gcomp.setData( ByteArrayofQML , QUrl() ) ;
gcomp.create() -> Show the QML in the QML Engine
if (gcomp.isError() == false) -> we have visible QML!

1) How does one cause all properties in the root context for QML
engine be triggered to re-evaluate their bindings again. For example
Text { text: gvariable }, it want text object to re-fetch its own
values instead of pushing values with Qobject->setProperty().  Generic
pull instead of specific push.

Can I cause a disturbance in the QmlContext and that would trigger and
"expensive" refetching of text values for example.


On one hand, this question doesn't make sense. QML vars are considered 
changed immediately, and that's a basic design choice.


OTOH, it's very simple to do this yourself. Just create a function 
that pulls in the new variable values. You might need a proxy object 
between the real value place and the QML land, but other than that you 
need no tricks for it.


2) How does one clear out everything loaded in the root QmlEngine 
context?


What is the best way to clear the root context of qmlengine of
everything prior to calling
gcomp->setData() and  gcomp->create( ) to load brand new QML into the 
QmlEngine?


geng->clearComponentCache() ?  Does this really flush everything out
regardless of anything that is currently visible on-screen?

I do not want to build up a pile of QObjects in the engine, I want
them cleanly flushed out.


Again, there are ways you could do this. Store the set of accepted 
vars and values and reset to exactly those when you want, for example.


But this idea smells badly of a fundamentally bad design. If you need 
to get rid of variables, reset them, etc. then they probably shouldn't 
be stored as context on the root engine. This sounds like one of the 
"how do I do B" because you are doing "A" already questions, and the 
problem is that "A" is wrong. We get those on this list all the time.


One idea I have used often is to have a backend object that is almost 
the only object exposed to QML. Inside this one you can set variables 
on the fly as you want. With the very limited amount of info you have 
given here this seems like a much more appropriate direction for you.


Bo Thorsen,
Director, Viking Software.


Bo:

Sorry if my information was limited.

What I was trying to say was that for the QMLEngine when it loads and 
displays QML ( component setData()/create() ), I want to trigger in a 
generic way an update to that information.


For example, when I change language from English to Spanish, I want the 
QMLEngine to re-fetch all of its bound values in a generic way, not 
specific hard coded setProperty( objectName,"text") calls to trigger.  
That is a maintenance and code pattern nightmare.  We need some generic 
way from C++ to trigger QML value re-fetch as if the


With respect to QmlEngine->clearComponentCache(), your appreciated 
answer is tied to variables and that is not what I was asking.  When I 
change screens, I want to dump the loaded QML and replace with new QML.  
The documentation does not give me a firm grasp of the relationship to 
C++ QQmlContext, QQmlEngine, and QQmlComponent.setData()/Create().


Now the 2 questions are related in that I could either "Update" the 
currently displayed QML when I change languages.  Or I can Dump the QML 
and reload it with the new language values.


Yes, I know Qt Translation exists, but that is not the point of the 
inquiry here, since I used a different design for my international support.


Cheers,

md
___
Interest mailing list
Interest@qt-project.org
http://lists.qt-project.org/mailman/listinfo/interest


Re: [Interest] 5.5/5.6 QMLEngine management

2016-01-10 Thread Bo Thorsen

Den 10-01-2016 kl. 03:21 skrev mark diener:

Hello List:

I have a couple of core QMLEngine questions:

Basic Code Snippet:

QQmlEngine geng ;

QQmlComponent gcomp()
gcomp.setData( ByteArrayofQML , QUrl() ) ;
gcomp.create() -> Show the QML in the QML Engine
if (gcomp.isError() == false) -> we have visible QML!

1) How does one cause all properties in the root context for QML
engine be triggered to re-evaluate their bindings again. For example
Text { text: gvariable }, it want text object to re-fetch its own
values instead of pushing values with Qobject->setProperty().  Generic
pull instead of specific push.

Can I cause a disturbance in the QmlContext and that would trigger and
"expensive" refetching of text values for example.


On one hand, this question doesn't make sense. QML vars are considered 
changed immediately, and that's a basic design choice.


OTOH, it's very simple to do this yourself. Just create a function that 
pulls in the new variable values. You might need a proxy object between 
the real value place and the QML land, but other than that you need no 
tricks for it.



2) How does one clear out everything loaded in the root QmlEngine context?

What is the best way to clear the root context of qmlengine of
everything prior to calling
gcomp->setData() and  gcomp->create( ) to load brand new QML into the QmlEngine?

geng->clearComponentCache() ?  Does this really flush everything out
regardless of anything that is currently visible on-screen?

I do not want to build up a pile of QObjects in the engine, I want
them cleanly flushed out.


Again, there are ways you could do this. Store the set of accepted vars 
and values and reset to exactly those when you want, for example.


But this idea smells badly of a fundamentally bad design. If you need to 
get rid of variables, reset them, etc. then they probably shouldn't be 
stored as context on the root engine. This sounds like one of the "how 
do I do B" because you are doing "A" already questions, and the problem 
is that "A" is wrong. We get those on this list all the time.


One idea I have used often is to have a backend object that is almost 
the only object exposed to QML. Inside this one you can set variables on 
the fly as you want. With the very limited amount of info you have given 
here this seems like a much more appropriate direction for you.


Bo Thorsen,
Director, Viking Software.

--
Viking Software
Qt and C++ developers for hire
http://www.vikingsoft.eu
___
Interest mailing list
Interest@qt-project.org
http://lists.qt-project.org/mailman/listinfo/interest


[Interest] 5.5/5.6 QMLEngine management

2016-01-09 Thread mark diener
Hello List:

I have a couple of core QMLEngine questions:

Basic Code Snippet:

QQmlEngine geng ;

QQmlComponent gcomp()
gcomp.setData( ByteArrayofQML , QUrl() ) ;
gcomp.create() -> Show the QML in the QML Engine
if (gcomp.isError() == false) -> we have visible QML!

1) How does one cause all properties in the root context for QML
engine be triggered to re-evaluate their bindings again. For example
Text { text: gvariable }, it want text object to re-fetch its own
values instead of pushing values with Qobject->setProperty().  Generic
pull instead of specific push.

Can I cause a disturbance in the QmlContext and that would trigger and
"expensive" refetching of text values for example.

2) How does one clear out everything loaded in the root QmlEngine context?

What is the best way to clear the root context of qmlengine of
everything prior to calling
gcomp->setData() and  gcomp->create( ) to load brand new QML into the QmlEngine?

geng->clearComponentCache() ?  Does this really flush everything out
regardless of anything that is currently visible on-screen?

I do not want to build up a pile of QObjects in the engine, I want
them cleanly flushed out.

Thank you for any responses,

md
___
Interest mailing list
Interest@qt-project.org
http://lists.qt-project.org/mailman/listinfo/interest