[SailfishDevel] how to find (QML) objects other than rootObject
christopher.lamb at thurweb.ch
christopher.lamb at thurweb.ch
Mon May 13 18:56:49 UTC 2013
Hi Wim
As always, Thomas's advice is sound: a true software engineer.
Perhaps you should explain your use case in more detail: why you want
your C++ to have deep insight into the QML side.
I have always considered the QML side to be the client, and the C++
(plugin) to be the server, offering services to the QML; with the QML
being in control. But it would interest me to hear of different models.
Tot zins
Chris
Zitat von "Thomas Perl" <th.perl at gmail.com>:
> Hi Wim,
>
> On May 13, 2013, at 3:24 PM, Wim de Vries <wsvries at xs4all.nl> wrote:
>> I am setting up the default Sailfish ("Hello sailors" app) project
>> with all kinds of QML-C++ communication.
>> After
>> object = view->rootObject("main.qml");
>> I get the main.qml object (created via QDeclarativeView's setSource() ).
>> But how can I get the other QML objects (e.g. the SecondPage.qml,
>> Coverpage.qml)?
>> findChild() only finds childs in main.qml (the one specified by
>> setSource()).
>
> In 97.6% of the cases, you don't want to do that (it makes your C++
> code dependent on the structure of the QML UI). The better way to
> interface C++ and QML is to either write a QML Plugin in C++ and
> instantiate that from the QML side, or to expose a global
> "controller" object as context property to QML.
>
> If you think your use case is one of the 2.4%, you can add a variant
> property to your main object and then in QML point it to the object
> you want exposed, e.g.:
>
> Rectangle {
> property variant something: someObject
> Item { id: someObject }
> }
>
> You should then be able to get the "something" property from your
> main object and receive a reference to the item. Of course, this
> doesn't work that well when you dynamically instantiate objects, so
> the plugin or context property way is still the recommended way of
> doing things. Your controller object could even have a function like
> this (untested):
>
> Q_INVOKABLE void registerObject(QString name, QObject *object);
>
> You could then let your C++ controller object know about that object
> from QML like this:
>
> Item {
> id: blubb
> Component.onCompleted: controller.registerObject('blubb', blubb)
> }
>
> In general, though, don't do this - the C++ side should not make any
> assumptions about the structure and objects in QML. It will make the
> architecture of your app nicer and easier to adapt to UI changes.
> Also, it will be easier to debug, as there is a single place (the
> controller object) through which communcation happens.
>
>
> HTH :)
> Thomas
>
> _______________________________________________
> SailfishOS.org Devel mailing list
>
More information about the Devel
mailing list