Can I use QList (or something similar) as Q_PROPERTY? How can I use it in QML?
Best regards, Nick 2013/10/2 Vladimir M. <mlvl...@gmail.com> > CONSTANT (or whatever the name is) helps here as well -- if the prop does > not change :) > > > On Wed, Oct 2, 2013 at 7:58 PM, Николай Шатохин <n.shatok...@gmail.com>wrote: > >> Hm, yes, it helps. Thank you. >> >> >> 2013/10/2 Roman Shchekin <mrqt...@gmail.com> >> >>> You should register Game via qmlRegisterType too. >>> >>> Your Engine's "game" property used in binding and it has no NOTIFY >>> signal. >>> I hope you know what is it. If no - you should learn basics of Qt first. >>> >>> Cheers, >>> Roman. >>> >>> >>> 2013/10/2 Николай Шатохин <n.shatok...@gmail.com> >>> >>>> I did it, but now I got: >>>> >>>> QMetaProperty::read: Unable to handle unregistered datatype 'Game*' for >>>> property 'Engine::game' >>>> >>>> QQmlExpression: Expression qrc:/Reactor.qml:7 depends on non-NOTIFYable >>>> properties: >>>> >>>> Engine::game >>>> >>>> On application startup (game is Q_PROPERY of Engine and has type Game >>>> *). >>>> >>>> >>>> 2013/10/2 Vladimir M. <mlvl...@gmail.com> >>>> >>>>> Just put the star in the property decl -- it's the stock way to do it, >>>>> and the decl w/o star will be deprecated probably soon, as far as I know. >>>>> Then, bind to the props in qml, and that's it! >>>>> 02 окт. 2013 г. 14:31 пользователь "Николай Шатохин" < >>>>> n.shatok...@gmail.com> написал: >>>>> >>>>> >>>>>> Ok, I registered as 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) >>>>>> >>>>>> >>>>>> >>>>>> 2013/9/30 Vladimir M. <mlvl...@gmail.com> >>>>>> >>>>>>> Sure, you can always wire as many objects as possible to smth >>>>>>> existing in a scene or set as a context property -- it's a simple >>>>>>> Q_PROPERTY assignment on the C++ side, with a pointer passed to the >>>>>>> setter >>>>>>> (and works as soon as you declare the property on the QML side (or >>>>>>> register >>>>>>> and instantiate a C++ implemented item)). >>>>>>> >>>>>>> After all, these are ordinary QObejcts passing pointers (to each >>>>>>> other) to each other :) >>>>>>> (plus some memory management -- automatic on the QML side, and >>>>>>> QObject parent-tree based on the C++ side) >>>>>>> >>>>>>> Vladimir >>>>>>> >>>>>>> >>>>>>> On Mon, Sep 30, 2013 at 6:24 PM, Николай Шатохин < >>>>>>> n.shatok...@gmail.com> wrote: >>>>>>> >>>>>>>> What if I will create property backend in QML type and then I will >>>>>>>> set this property in all QML objects to global object? So, >>>>>>>> theoretically >>>>>>>> this can solve my problem. >>>>>>>> >>>>>>>> >>>>>>>> 2013/9/30 Vladimir M. <mlvl...@gmail.com> >>>>>>>> >>>>>>>> Then, it looks like the standard way would be to have an instance >>>>>>>>> of the item embedded in each page in the stack. >>>>>>>>> >>>>>>>>> If this turns out to be too resource consuming, you may try to >>>>>>>>> play some tricks like removing it from all the pages and overlaying >>>>>>>>> over >>>>>>>>> the whole stack (if the item will always be in the same place, and >>>>>>>>> have the >>>>>>>>> same geometry, this will be rather simple, children order or z-value >>>>>>>>> will >>>>>>>>> allow it place it on top). >>>>>>>>> >>>>>>>>> If geometry is different for each page, this may get trickier >>>>>>>>> (ultimate solution may be some sort of a "placeholder item" having the >>>>>>>>> right place in each page, to which the item gets parented when the >>>>>>>>> placeholder becomes visible, with "fill" anchoring). >>>>>>>>> >>>>>>>>> On the other hand, if the item has to have it's state consistent >>>>>>>>> between the pages, then even if its is feasible performance-wise to >>>>>>>>> embed >>>>>>>>> it into all of them, some sort of common "view state model" should >>>>>>>>> probably >>>>>>>>> exist, and this again suggests just using a single instance... >>>>>>>>> >>>>>>>>> Vladimir >>>>>>>>> >>>>>>>>> >>>>>>>>> On Mon, Sep 30, 2013 at 3:07 PM, Николай Шатохин < >>>>>>>>> n.shatok...@gmail.com> wrote: >>>>>>>>> >>>>>>>>>> I need to have this object in different qml files (for i.e. >>>>>>>>>> GameChat must be shown on GameCreation,Game,GameResults pages: this >>>>>>>>>> it >>>>>>>>>> differents QML files and differents pages in PageStack), but I >>>>>>>>>> created only >>>>>>>>>> one QtQuickView in main.cpp. So, do view is qml file or QtQuckView >>>>>>>>>> object? >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> 2013/9/30 Vladimir M. <mlvl...@gmail.com> >>>>>>>>>> >>>>>>>>>> You probably can't share a single instance of a QML visual item >>>>>>>>>>> between views, but as soon as you have the type registered properly >>>>>>>>>>> / >>>>>>>>>>> importable / etc, you can use instantiate it in as many views as >>>>>>>>>>> you like. >>>>>>>>>>> A QObject pointer can be passed around to items living in >>>>>>>>>>> different veiws inside the same application, of course (but watch >>>>>>>>>>> out for >>>>>>>>>>> memory management issues -- see CppOwnership / QMLOwnership / etc >>>>>>>>>>> in the >>>>>>>>>>> docs under "memory management"). >>>>>>>>>>> >>>>>>>>>>> Easiest way may be to set the same object as a context prop for >>>>>>>>>>> several views (unless you have some objections to this practice, >>>>>>>>>>> like ones >>>>>>>>>>> mentioned up in the thread). >>>>>>>>>>> >>>>>>>>>>> Lastly, there is that (legitimate) trick allowing QML items to >>>>>>>>>>> be "rendered" by other items, resulting in the same item being >>>>>>>>>>> shown in >>>>>>>>>>> multiple places of the same scene (but being manipalatable anywhere >>>>>>>>>>> except >>>>>>>>>>> its actual position) -- look into the shader effects and such. >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> On Mon, Sep 30, 2013 at 2:34 PM, Николай Шатохин < >>>>>>>>>>> n.shatok...@gmail.com> wrote: >>>>>>>>>>> >>>>>>>>>>>> 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.shatok...@gmail.com> >>>>>>>>>>>> >>>>>>>>>>>>> 0_o. I didn't know that all objects in QML are global. Thank >>>>>>>>>>>>> you very much. >>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>>> 2013/9/30 <mrqt...@gmail.com> >>>>>>>>>>>>> >>>>>>>>>>>>> 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.zane...@canonical.com> >>>>>>>>>>>>>> >>>>>>>>>>>>>>> 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.shatok...@gmail.com> >>>>>>>>>>>>>>> > >>>>>>>>>>>>>>> > > 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.zane...@canonical.com >>>>>>>>>>>>>>> > >>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>> > >> 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.shatok...@gmail.com>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@lists.launchpad.net >>>>>>>>>>>>>>> > >> > > Unsubscribe : https://launchpad.net/~ubuntu-phone >>>>>>>>>>>>>>> > >> > > More help : https://help.launchpad.net/ListHelp >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> -- >>>>>>>>>>>> Mailing list: https://launchpad.net/~ubuntu-phone >>>>>>>>>>>> Post to : ubuntu-phone@lists.launchpad.net >>>>>>>>>>>> Unsubscribe : https://launchpad.net/~ubuntu-phone >>>>>>>>>>>> More help : https://help.launchpad.net/ListHelp >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>> >>>>>>>>> >>>>>>>> >>>>>>> >>>>>> >>>> >>> >> >> -- >> Mailing list: https://launchpad.net/~ubuntu-phone >> Post to : ubuntu-phone@lists.launchpad.net >> Unsubscribe : https://launchpad.net/~ubuntu-phone >> More help : https://help.launchpad.net/ListHelp >> >> >
-- Mailing list: https://launchpad.net/~ubuntu-phone Post to : ubuntu-phone@lists.launchpad.net Unsubscribe : https://launchpad.net/~ubuntu-phone More help : https://help.launchpad.net/ListHelp