← Back to team overview

ubuntu-phone team mailing list archive

Re: Create QML view for C++ object (not class)

 

What if I need to show the same QML object in two different places? How to
do this? How to create new QML object without recreating it in C++?


2013/9/30 Николай Шатохин <n.shatokhin@xxxxxxxxx>

> 0_o. I didn't know that all objects in QML are global. Thank you very much.
>
>
> 2013/9/30 <mrqtros@xxxxxxxxx>
>
>  Omg declare global engine object in main qml file and that's all
>>
>> 30.09.13 13:19 Николай Шатохин написал(а):
>> I'm using qmlRegisterType now. I have problems, because two QML objects
>> in different QML files it is two different objects in C++. I registered as
>> type class that have static object of Engine, but now I have butthurt with
>> it (I need retranslate all signals, getters and setters)
>>
>>
>> 2013/9/30 Michael Zanetti <michael.zanetti@xxxxxxxxxxxxx>
>>
>>> On Monday 30 September 2013 12:05:03 Николай Шатохин wrote:
>>> > Can I set only one object as context property that contains other
>>> objects
>>> > (and this objects contain objects too) and get this deep objects in
>>> QML?
>>> >
>>> > For i.e. I have object of class Engine that has object of class Game,
>>> Game
>>> > contains object of Ship and Ship contains object of Reactor. So, I set
>>> > object of Engine as context property and in QML write:
>>> >
>>> > engine.game.ship.reactor
>>> >
>>> > Can I use it?
>>>
>>>
>>> Yes, given that "game" is a Q_PROPERTY() of "enigne", "ship" is a
>>> Q_PROPERTY()
>>> of "game" etc...
>>>
>>> Still, I recommend to register the type of the Engine instead of setting
>>> it as
>>> a context property.
>>>
>>> It's really just using qmlRegisterType() instead of
>>> setContextProperty(). It's
>>> not more or more complex code, but gives you better ways of structuring
>>> your
>>> QML code.
>>>
>>> >
>>> >
>>> > 2013/9/30 Николай Шатохин <n.shatokhin@xxxxxxxxx>
>>> >
>>> > > I've already found this solution:
>>> > >
>>> http://qt-project.org/doc/qt-5.0/qtqml/qtqml-cppintegration-contextpropert
>>> > > ies.html It helps. Thanks.
>>> > >
>>> > >
>>> > > 2013/9/30 Michael Zanetti <michael.zanetti@xxxxxxxxxxxxx>
>>> > >
>>> > >> On Sunday 29 September 2013 13:45:01 Vladimir M. wrote:
>>> > >> > Sounds like a "context property" use case (you plain set a
>>> QObject as a
>>> > >> > context property for a view's root scope, w/o even registering the
>>> > >>
>>> > >> object's
>>> > >>
>>> > >> > type, and all its properties and invokables become available).
>>> > >>
>>> > >> I don't recommend using context properties. While they are useful
>>> for
>>> > >> some
>>> > >> cases, this one doesn't seem to be one of those. Using too many
>>> global
>>> > >> context
>>> > >> properties can make the code very ugly to work with.
>>> > >>
>>> > >> You probably want to create something like this:
>>> > >>
>>> > >> class ViewController: public QObject
>>> > >> {
>>> > >>
>>> > >>   Q_PROPERTY(QList<MyClass> viewObjects READ viewObjects NOTIFY
>>> > >>
>>> > >> viewObjectsChanged)
>>> > >> ...
>>> > >> QList<MyClass> viewObjects() const {
>>> > >>
>>> > >>   return objectList;
>>> > >>
>>> > >> }
>>> > >> ...
>>> > >> };
>>> > >>
>>> > >> qmlRegisterType<ViewController>(uri, 0, 1, "ViewController");
>>> > >>
>>> > >> Then in QML you can do something like this:
>>> > >>
>>> > >> ViewController {
>>> > >>
>>> > >>   id: viewController
>>> > >>
>>> > >> }
>>> > >>
>>> > >> Repeater {
>>> > >>
>>> > >>   model: viewController.viewObjects
>>> > >>   MyView {
>>> > >>
>>> > >>     property var viewObject: viewController.viewObjects[index]
>>> > >>
>>> > >>   }
>>> > >>
>>> > >> }
>>> > >>
>>> > >>
>>> > >> Note that if you want your code to adjust more flexible (i.e. the
>>> > >> viewObjects
>>> > >> change a lot), consider using a QAbstractListModel (or some other
>>> model)
>>> > >> instead of a QList.
>>> > >>
>>> > >> Hope this helps,
>>> > >> Michael
>>> > >>
>>> > >> > On Sun, Sep 29, 2013 at 6:38 AM, Николай Шатохин
>>> > >>
>>> > >> <n.shatokhin@xxxxxxxxx>wrote:
>>> > >> > > Hello.
>>> > >> > >
>>> > >> > > When I create a class in C++, I can register it for QML and can
>>> > >> > > create
>>> > >> > > view for it. It's very convenient. But, if I need many objects
>>> of the
>>> > >>
>>> > >> same
>>> > >>
>>> > >> > > type, and need to show few views on screen, I got problems.
>>> > >> > > Is it possible to register QML type for object, not for class?
>>> > >> > > If I change some object, I need to see only its view changed.
>>> > >> > >
>>> > >> > > Best regard,
>>> > >> > > Nick
>>> > >> > >
>>> > >> > > --
>>> > >> > > Mailing list: https://launchpad.net/~ubuntu-phone
>>> > >> > > Post to     : ubuntu-phone@xxxxxxxxxxxxxxxxxxx
>>> > >> > > Unsubscribe : https://launchpad.net/~ubuntu-phone
>>> > >> > > More help   : https://help.launchpad.net/ListHelp
>>>
>>>
>>
>>
>

Follow ups

References