← Back to team overview

ubuntu-phone team mailing list archive

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

 

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.jr@xxxxxxxxx>

> 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.shatokhin@xxxxxxxxx>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.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
>>>>>
>>>>>
>>>>
>>>>
>>>
>>
>> --
>> 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