Access data of C++ model from QML?



  • From the C++ side of things my QML UI is passed a model
    (QAbstractTableModel instance), used for a TableView. This works very
    nicely.

    Now, I want my QML UI to interact with selected rows, i.e. display data
    of the selected rows... for a start.

    I fail to see how this is possible. Clearly this has to bee done in the
    onSelectionChanged handler of the TableView, but how do I actually
    access the data?

    This answer [1] on qtcentre suggests adding a Q_INVOKABLE method to the
    model for this. However since the model implements already a
    standardized interface for querying data as well as metadata I don't
    think it's a good idea or particularly wise to implement additional
    interface extensions that are non-standard and also not generic.
    Sometimes it is also not possible or not feasible to modify the model.

    Now, somehow the data of course finds its way into QML, since I can see
    it in the TableView... however, the details of model access seem to be
    written in C++...

    So, long post, short recap: How do I access data of a C++ table model
    from within QML given the model and a row index?

    [1]
    http://www.qtcentre.org/threads/52850-How-to-get-data-from-TableView-QML-Desktop-Components?p=237157#post237157


  • Lifetime Qt Champion

    Hi and welcome to devnet,

    Did you saw this "chapter":http://qt-project.org/doc/qt-5/qtquick-modelviewsdata-cppmodels.html#qabstractitemmodel of Qt's documentation about that subject ?

    Hope it helps



  • Hi,
    yes I found that one, but I didn't see the reference to DelegateModel the first time. I'm currently trying to work with that, but have to issues with it:

    • If I use the DelegateModel (with model-property set to my C++ model and the delegate property set to my item delegate) as the model for the TableView, the display is wrong (all items in the top left corner ; obviously some kind of layout issue)

    • However, dataModel.count and dataModel.items.count (dataModel is my DelegateModel instance) are correct.

    • dataModel.items.get(<someindex>) does even return an Object ; however it has no properties whatsoever (Object.keys(dataModel.items.get(<someindex>)) is empty). Trying to access properties "blindly" like <object from get()>.<rolename> didn't work (as expected).

    I'm not quite convinced that this is the way one should work with models... shouldn't that be a bit more... simple?

    I'm quite surprised that it's so hard to find an example of this ... does really no one ever need to access model data outside of a delegate?!


  • Moderators

    Hi,

    bq. does really no one ever need to access model data outside of a delegate?!

    If i understood you correctly you can access it by
    @
    tableViewId.model.get(tableViewIndex).role
    @



  • This seems only to work with QML-based models like ListModel. With a C++ model, I get an error:

    @TypeError: Property 'get' of object Logging::LogsModel(0x13343e0) is not a function@


  • Moderators

    Hmm, the best way would always be to go through the model i.e define a Q_INVOKABLE function as you mentioned earlier.

    Other pure QML way would be to interate over the childrens of TableView's contentItem.
    I had tested something similar but with ListView as follows:
    @
    for(var a=0; a<=listView.contentItem.children.length;a++)
    console.log(listView.contentItem.children[a].text)
    @

    This gives the texts of all elements of ListView even if the model is C++ based.
    May be you can try it for TableView but i have never tried this personally for TableView.


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.