[Interest] Pointers as Q_PPOPERTY

Николай Шатохин n.shatokhin at gmail.com
Fri Oct 4 10:58:24 CEST 2013


Yes, I did exactly the same. Thanks.


2013/10/4 Bo Thorsen <bthorsen at 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
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.qt-project.org/pipermail/interest/attachments/20131004/416e42e6/attachment.html>


More information about the Interest mailing list