Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. QML and Qt Quick
  4. Retrieve number of elements of a QAbstractListModel and access items by index and role in qml
Forum Updated to NodeBB v4.3 + New Features

Retrieve number of elements of a QAbstractListModel and access items by index and role in qml

Scheduled Pinned Locked Moved Solved QML and Qt Quick
16 Posts 3 Posters 4.5k Views 2 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • M Offline
    M Offline
    maxwell31
    wrote on last edited by
    #5

    Thanks again. The way with calling it with data and index is working. I am wondering though whether there is an easier way, which would use the roleNames in my model. Otherwise, I need to register my model class, so that I have the roleEnums available.

    Gojir4G 2 Replies Last reply
    0
    • M maxwell31

      Thanks again. The way with calling it with data and index is working. I am wondering though whether there is an easier way, which would use the roleNames in my model. Otherwise, I need to register my model class, so that I have the roleEnums available.

      Gojir4G Offline
      Gojir4G Offline
      Gojir4
      wrote on last edited by
      #6

      @maxwell31 Usually you use a model with a listview, a repeater, or any other "item" view. Then you access your roles using names defined in your implementation of QAbstractItemModel::roleNames, not the enum values.

      1 Reply Last reply
      0
      • M maxwell31

        Thanks again. The way with calling it with data and index is working. I am wondering though whether there is an easier way, which would use the roleNames in my model. Otherwise, I need to register my model class, so that I have the roleEnums available.

        Gojir4G Offline
        Gojir4G Offline
        Gojir4
        wrote on last edited by
        #7

        @maxwell31 What's is your goal exactly ?

        1 Reply Last reply
        0
        • M Offline
          M Offline
          maxwell31
          wrote on last edited by
          #8

          I understand what you are saying. My problem is the following:

          I have some c++ objects, which e.g. have a height property. I want to display these objects in my own qml bar chart. In order to compute the maximum height I iterate over the elements in my model in qml, and would like to access the height property. In a repeater or listmodel, the string role name is only available for the current object right? How could I access the height role inside a loop over my objects?

          Gojir4G 1 Reply Last reply
          0
          • M maxwell31

            I understand what you are saying. My problem is the following:

            I have some c++ objects, which e.g. have a height property. I want to display these objects in my own qml bar chart. In order to compute the maximum height I iterate over the elements in my model in qml, and would like to access the height property. In a repeater or listmodel, the string role name is only available for the current object right? How could I access the height role inside a loop over my objects?

            Gojir4G Offline
            Gojir4G Offline
            Gojir4
            wrote on last edited by
            #9

            @maxwell31 You can browse them using a loop from QML. But yes you need to register your type in this case to access the enum values.

            for(var i = 0; i < model.rowCount(); i++){
            model.data(model.index(i, 0),
            }

            I would suggest that you implement this kind of calculation in the C++ side, and just add a method like ``getMaxHeight()" in your model, with Q_INVOKABLE directive. At my opinion, it is easier to write and more efficient

            1 Reply Last reply
            0
            • M Offline
              M Offline
              maxwell31
              wrote on last edited by
              #10

              Most likely simply going to do

              qmlRegisterType<MyModel>("MyModel",1,0,"MyModel");
              

              is probably the easiest. Though annoying, as it has to be imported in the qml file. Obviously a maybe better option would be to move more of the logic to c++.

              But I understand it right, that there is no way in QML to iterate over the elements in a model and use the string role name?

              Gojir4G 1 Reply Last reply
              0
              • M maxwell31

                Most likely simply going to do

                qmlRegisterType<MyModel>("MyModel",1,0,"MyModel");
                

                is probably the easiest. Though annoying, as it has to be imported in the qml file. Obviously a maybe better option would be to move more of the logic to c++.

                But I understand it right, that there is no way in QML to iterate over the elements in a model and use the string role name?

                Gojir4G Offline
                Gojir4G Offline
                Gojir4
                wrote on last edited by
                #11

                @maxwell31 said in Retrieve number of elements of a QAbstractListModel and access items by index and role in qml:

                But I understand it right, that there is no way in QML to iterate over the elements in a model and use the string role name?

                I would say there is not simple way. But you could retrieve the roleNames() map from QML and then resolve role ID into names.

                1 Reply Last reply
                0
                • M Offline
                  M Offline
                  maxwell31
                  wrote on last edited by
                  #12

                  I think the roleNames map (QHash) does not convert to a type qml understands.

                  Gojir4G 1 Reply Last reply
                  0
                  • M maxwell31

                    I think the roleNames map (QHash) does not convert to a type qml understands.

                    Gojir4G Offline
                    Gojir4G Offline
                    Gojir4
                    wrote on last edited by Gojir4
                    #13

                    @maxwell31 Yes, as I said, there is no simple way. What about adding a method QString roleName(int role) in the model which return the name of a role.

                    @maxwell31 Yes, as I said, there is no simple way. What about adding a method int nameRole(QString roleName) in the model which return the role according to the name.

                    Anyway what does it changes if you use role or name of role ?

                    1 Reply Last reply
                    0
                    • GrecKoG Offline
                      GrecKoG Offline
                      GrecKo
                      Qt Champions 2018
                      wrote on last edited by
                      #14

                      I've created such class as proof of concept : https://github.com/oKcerG/QmlModelHelper (with the WiP readme : https://gist.github.com/oKcerG/eeea734bdacc51b3ae58650de5f05943)

                      in qml you could then do : yourModel.ModelHelper.roleForName("yourRoleName")

                      1 Reply Last reply
                      1
                      • M Offline
                        M Offline
                        maxwell31
                        wrote on last edited by
                        #15

                        @Gojir4 said in Retrieve number of elements of a QAbstractListModel and access items by index and role in qml:

                        Anyway what does it changes if you use role or name of role ?

                        I usually don't know the integer values of my custom roles, and without registering the model (which is a practicable solution) I don't have access to them. But you are right, adding a nameRole function would work fine.

                        1 Reply Last reply
                        0
                        • M Offline
                          M Offline
                          maxwell31
                          wrote on last edited by
                          #16

                          @GrecKo said in Retrieve number of elements of a QAbstractListModel and access items by index and role in qml:

                          I've created such class as proof of concept

                          Thanks for sharing

                          1 Reply Last reply
                          0

                          • Login

                          • Login or register to search.
                          • First post
                            Last post
                          0
                          • Categories
                          • Recent
                          • Tags
                          • Popular
                          • Users
                          • Groups
                          • Search
                          • Get Qt Extensions
                          • Unsolved