← Back to team overview

ubuntu-phone team mailing list archive

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

 

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