Yes, I did exactly the same. Thanks.
2013/10/4 Bo Thorsen <bthor...@ics.com> > Hi Николай Шатохин, > > I saw on the list, that you got this working. But there were a bunch of > things missing in the discussion. I have just done the same thing you are > trying in one of our 4.8.5 based projects. > > Some of this has been said, other parts haven't. I hope this is a complete > description that should help you understand the topic. > > Den 02-10-2013 16:12, Николай Шатохин skrev: > > I registered as QML Type class Ship inherited from QObject that have >> fields: >> >> Q_PROPERTY(Hull hull READ hull) >> Q_PROPERTY(Reactor reactor READ reactor) >> Q_PROPERTY(Shields shields READ shields) >> >> (all field classes inherited from QObject too) >> >> But in ship class I'm using this fields as pointers (Hull * hull). So, >> how to use correctly Q_Properties in this case? (I need call methods >> from this fields and catch signals from them in QML) >> >> Can I use something like this Q_PROPERTY(Hull hull READ hull)? >> > > As already pointed out, you have to do pointers for this: > > class Hull : public QObject { ... }; > > class Ship : public QObject { > Q_OBJECT > Q_PROPERTY(Hull* hull READ hull CONSTANT) > Hull* m_hull; > public: > Ship() : m_hull(new Hull(this)) {} > Hull* hull() { return m_hull; } > }; > > The Reactor and Shields work exactly the same way. > > For this to work, you have to declare the Hull, Reactor and Shields types > to the QML engine. Something like this: > > qmlRegisterUncreatableType<**Hull>("MyGame", 1, 0, "Hull", "Can't be > created."); > qmlRegisterType<Ship>("MyGame"**, 1, 0, "Ship"); > > > And then in QML: >> >> Ship >> { >> id: ship >> Hull >> { >> id: hull_indicator >> backend: ship.hull >> } >> >> onDamage: >> { >> ship.hull.reduce(damage); >> } >> } >> > > You don't need the extra Hull {} declaration here. There is already a Hull > object in your ship, the "ship.hull" you use in onDamage. > > If this is about visualization, you should have a different set of > classes, ShipView and HullView or something, that shows this: > > import MyGame 1.0 > Item { > id: completeShip > > ShipView { > anchors.fill: parent > ship: internal.ship > } > > HullView { > anchors.fill: parent > hull: internal.ship.hull > } > > QtObject { > id: internal > > Ship { > id: ship > } > } > } > > This might seem complicated at first, but you achieve one thing I find > extremely important in QML coding: Keep your state in C++ and totally > separated from the visualization of it. > > This is a standard MVC pattern, actually. The Ship is the model, the > completeShip is the controller and ShipView/HullView is the visualization. > But somehow this isn't always followed when people code QML. > > I hope this helps. > > Bo. > > -- > Bo Thorsen, European Qt Manager, ICS > Integrated Computer Solutions. Delivering World-Class Applications > http://ics.com/services >
_______________________________________________ Interest mailing list Interest@qt-project.org http://lists.qt-project.org/mailman/listinfo/interest