← Back to team overview

ubuntu-phone team mailing list archive

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

 

On Monday 30 September 2013 12:19:05 Николай Шатохин wrote:
> 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)

There are 2 easy solutions to this:

Either you just create one single instance in your main.qml file and just refer 
to that one from the other files:

main.qml:

MyType {
  id: engine
}

You can then access it from everywhere using just using "engine". This is 
quite similar to having a global context property, with the advantage that you 
can easily change it when you need a second engine (as opposed to the context 
property).

Alternatively, you can use qmlRegisterSingletonType() if you are really sure 
that's what you want. In that case it will only create one C++ object and 
refer to that every time you use "MyType".

Br,
Michael

> 
> 
> 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



References