Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. Need help to create simple model for QTreeModelView
Forum Updated to NodeBB v4.3 + New Features

Need help to create simple model for QTreeModelView

Scheduled Pinned Locked Moved Solved General and Desktop
37 Posts 4 Posters 4.2k Views 3 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.
  • mrjjM Offline
    mrjjM Offline
    mrjj
    Lifetime Qt Champion
    wrote on last edited by
    #17

    Hi
    Im not sure what is wrong as could also be the index but you can take a look at
    https://doc.qt.io/qt-5/qtwidgets-itemviews-editabletreemodel-example.html
    which seems very similar to your code.

    Please_Help_me_DP 1 Reply Last reply
    0
    • mrjjM mrjj

      Hi
      Im not sure what is wrong as could also be the index but you can take a look at
      https://doc.qt.io/qt-5/qtwidgets-itemviews-editabletreemodel-example.html
      which seems very similar to your code.

      Please_Help_me_DP Offline
      Please_Help_me_DP Offline
      Please_Help_me_D
      wrote on last edited by
      #18

      @mrjj ok
      How do you think, is it possible that the problem is how I declare variables (pointers/references and const)?. Sometimes they differ from examples but I think it should be fine

      mrjjM 1 Reply Last reply
      0
      • Please_Help_me_DP Please_Help_me_D

        @mrjj ok
        How do you think, is it possible that the problem is how I declare variables (pointers/references and const)?. Sometimes they differ from examples but I think it should be fine

        mrjjM Offline
        mrjjM Offline
        mrjj
        Lifetime Qt Champion
        wrote on last edited by mrjj
        #19

        @Please_Help_me_D
        well i think its fine since app compiles etc.
        Its more that if you use internalPointer as in the example so it does point to what you expect.

        Please_Help_me_DP 1 Reply Last reply
        0
        • Please_Help_me_DP Please_Help_me_D

          @JonB and is it normal? or my code looks so scarry that Qt don't know what to do whith it :)

          JonBJ Offline
          JonBJ Offline
          JonB
          wrote on last edited by
          #20

          @Please_Help_me_D said in Need help to create simple model for QTreeModelView:

          @JonB and is it normal? or my code looks so scarry that Qt don't know what to do whith it :)

          No, it's normal that infrastructure will call your rowCount() a lot :)

          1 Reply Last reply
          0
          • mrjjM mrjj

            @Please_Help_me_D
            well i think its fine since app compiles etc.
            Its more that if you use internalPointer as in the example so it does point to what you expect.

            Please_Help_me_DP Offline
            Please_Help_me_DP Offline
            Please_Help_me_D
            wrote on last edited by
            #21

            @mrjj @JonB well guess what? Yes I've found the snippet of code that made me feel useless for whole day :D
            Previously I had the MyModel::data() method:

            QVariant MyModel::data(const QModelIndex &index, int role) const
            {
                if (!index.isValid()) {
                    return QVariant();
                }
                
                const MyItem* item = static_cast<MyItem*>(index.internalPointer());
                return item->title;
            }
            

            But when I change it to:

            QVariant MyModel::data(const QModelIndex &index, int role) const
            {
                if (!index.isValid()) {
                    return QVariant();
                }
            
                if (role != Qt::DisplayRole && role != Qt::EditRole)
                    return QVariant();
            
                const MyItem* item = static_cast<MyItem*>(index.internalPointer());
                return item->title;
            }
            

            everything works :)
            Now I'm trying to understand what the role is
            Thank you for help!

            mrjjM JonBJ 2 Replies Last reply
            0
            • Please_Help_me_DP Please_Help_me_D

              @mrjj @JonB well guess what? Yes I've found the snippet of code that made me feel useless for whole day :D
              Previously I had the MyModel::data() method:

              QVariant MyModel::data(const QModelIndex &index, int role) const
              {
                  if (!index.isValid()) {
                      return QVariant();
                  }
                  
                  const MyItem* item = static_cast<MyItem*>(index.internalPointer());
                  return item->title;
              }
              

              But when I change it to:

              QVariant MyModel::data(const QModelIndex &index, int role) const
              {
                  if (!index.isValid()) {
                      return QVariant();
                  }
              
                  if (role != Qt::DisplayRole && role != Qt::EditRole)
                      return QVariant();
              
                  const MyItem* item = static_cast<MyItem*>(index.internalPointer());
                  return item->title;
              }
              

              everything works :)
              Now I'm trying to understand what the role is
              Thank you for help!

              mrjjM Offline
              mrjjM Offline
              mrjj
              Lifetime Qt Champion
              wrote on last edited by
              #22

              @Please_Help_me_D said in Need help to create simple model for QTreeModelView:

              that made me feel useless for whole day

              Ehh, should it not make you feel happy you found it ?

              So good spotted.

              The roles are explained here
              https://doc.qt.io/qt-5/qt.html#ItemDataRole-enum

              Please_Help_me_DP 1 Reply Last reply
              0
              • mrjjM mrjj

                @Please_Help_me_D said in Need help to create simple model for QTreeModelView:

                that made me feel useless for whole day

                Ehh, should it not make you feel happy you found it ?

                So good spotted.

                The roles are explained here
                https://doc.qt.io/qt-5/qt.html#ItemDataRole-enum

                Please_Help_me_DP Offline
                Please_Help_me_DP Offline
                Please_Help_me_D
                wrote on last edited by
                #23

                @mrjj I would be if not my birthday today :D

                mrjjM 1 Reply Last reply
                0
                • Please_Help_me_DP Please_Help_me_D

                  @mrjj I would be if not my birthday today :D

                  mrjjM Offline
                  mrjjM Offline
                  mrjj
                  Lifetime Qt Champion
                  wrote on last edited by
                  #24

                  @Please_Help_me_D
                  :)
                  Ok fair enough but it's also a bit hardcore to fiddle with QAbstractItemModel on
                  such a special day :)

                  alt text

                  Please_Help_me_DP 2 Replies Last reply
                  0
                  • mrjjM mrjj

                    @Please_Help_me_D
                    :)
                    Ok fair enough but it's also a bit hardcore to fiddle with QAbstractItemModel on
                    such a special day :)

                    alt text

                    Please_Help_me_DP Offline
                    Please_Help_me_DP Offline
                    Please_Help_me_D
                    wrote on last edited by
                    #25

                    @mrjj thank you))
                    hardcore is my lastname :)

                    1 Reply Last reply
                    0
                    • Please_Help_me_DP Please_Help_me_D

                      @mrjj @JonB well guess what? Yes I've found the snippet of code that made me feel useless for whole day :D
                      Previously I had the MyModel::data() method:

                      QVariant MyModel::data(const QModelIndex &index, int role) const
                      {
                          if (!index.isValid()) {
                              return QVariant();
                          }
                          
                          const MyItem* item = static_cast<MyItem*>(index.internalPointer());
                          return item->title;
                      }
                      

                      But when I change it to:

                      QVariant MyModel::data(const QModelIndex &index, int role) const
                      {
                          if (!index.isValid()) {
                              return QVariant();
                          }
                      
                          if (role != Qt::DisplayRole && role != Qt::EditRole)
                              return QVariant();
                      
                          const MyItem* item = static_cast<MyItem*>(index.internalPointer());
                          return item->title;
                      }
                      

                      everything works :)
                      Now I'm trying to understand what the role is
                      Thank you for help!

                      JonBJ Offline
                      JonBJ Offline
                      JonB
                      wrote on last edited by JonB
                      #26

                      @Please_Help_me_D said in Need help to create simple model for QTreeModelView:

                      Now I'm trying to understand what the role is

                      @mrjj has given you the documentation reference page for roles. You must read that! In Qt models, an index does not just store/return what you think of of as "the value" of that item, it also stores/returns a variety of additional data which you might want to set for each data item. Qt calls these "roles", I don't know where it gets that name from, you might think of them as "attributes".

                      When you implement your model's data() override, and also setData() if you allow updates, you must make their behaviour take into account the value of the role parameter. The Qt infrastructure (e.g. any views attached to the model) will be calling your data()/setData() methods a lot of times, with a variety of roles. For example, it will call data(index, Qt::ForegroundRole) for every cell to ask what color the text should be, or data(index, Qt::ToolTipRole) every time it wants to potentially show a tooltip.

                      The normal pattern I follow for, say, data() is:

                      QVariant MyModel::data(const QModelIndex &index, int role) const
                      {
                          if (!index.isValid())
                              return QVariant();
                          switch (role)
                          {
                          case Qt::DisplayRole:
                          case Qt::EditRole:
                              return somethingToDoWithWhatYouThinkOfAsTheValue;
                          case Qt::AnotherRoleIWantToHandle:
                              return somethingSuitable;
                          default: break;
                          }
                          return BaseModel::data(index, role);
                      }
                      

                      And similarly for setData(). Note how we return the base class's data()/setData() method for any cases we don't handle; this allow for future updates.

                      Please_Help_me_DP 1 Reply Last reply
                      3
                      • JonBJ JonB

                        @Please_Help_me_D said in Need help to create simple model for QTreeModelView:

                        Now I'm trying to understand what the role is

                        @mrjj has given you the documentation reference page for roles. You must read that! In Qt models, an index does not just store/return what you think of of as "the value" of that item, it also stores/returns a variety of additional data which you might want to set for each data item. Qt calls these "roles", I don't know where it gets that name from, you might think of them as "attributes".

                        When you implement your model's data() override, and also setData() if you allow updates, you must make their behaviour take into account the value of the role parameter. The Qt infrastructure (e.g. any views attached to the model) will be calling your data()/setData() methods a lot of times, with a variety of roles. For example, it will call data(index, Qt::ForegroundRole) for every cell to ask what color the text should be, or data(index, Qt::ToolTipRole) every time it wants to potentially show a tooltip.

                        The normal pattern I follow for, say, data() is:

                        QVariant MyModel::data(const QModelIndex &index, int role) const
                        {
                            if (!index.isValid())
                                return QVariant();
                            switch (role)
                            {
                            case Qt::DisplayRole:
                            case Qt::EditRole:
                                return somethingToDoWithWhatYouThinkOfAsTheValue;
                            case Qt::AnotherRoleIWantToHandle:
                                return somethingSuitable;
                            default: break;
                            }
                            return BaseModel::data(index, role);
                        }
                        

                        And similarly for setData(). Note how we return the base class's data()/setData() method for any cases we don't handle; this allow for future updates.

                        Please_Help_me_DP Offline
                        Please_Help_me_DP Offline
                        Please_Help_me_D
                        wrote on last edited by
                        #27

                        @JonB thank you for explanation! This is useful for me to know

                        1 Reply Last reply
                        0
                        • mrjjM mrjj

                          @Please_Help_me_D
                          :)
                          Ok fair enough but it's also a bit hardcore to fiddle with QAbstractItemModel on
                          such a special day :)

                          alt text

                          Please_Help_me_DP Offline
                          Please_Help_me_DP Offline
                          Please_Help_me_D
                          wrote on last edited by
                          #28

                          @mrjj Once again I need help
                          I set two items to the root item. So here should be one openable item wich after unwrapping should show two other items... but it shows itself instead:

                          void MyModel::fetchRootDirectory()
                          {
                              MyItem* item = new MyItem("first_item");
                              MyItem* item1 = new MyItem("first_child");
                              MyItem* item2 = new MyItem("second_child");
                              item->children.push_back(item1);
                              item->children.push_back(item2);
                              _items.push_back(item);
                          }
                          

                          Also there is something wrong with highlighting of chosen item

                          Here is the updated project

                          mrjjM 1 Reply Last reply
                          0
                          • Please_Help_me_DP Please_Help_me_D

                            @mrjj Once again I need help
                            I set two items to the root item. So here should be one openable item wich after unwrapping should show two other items... but it shows itself instead:

                            void MyModel::fetchRootDirectory()
                            {
                                MyItem* item = new MyItem("first_item");
                                MyItem* item1 = new MyItem("first_child");
                                MyItem* item2 = new MyItem("second_child");
                                item->children.push_back(item1);
                                item->children.push_back(item2);
                                _items.push_back(item);
                            }
                            

                            Also there is something wrong with highlighting of chosen item

                            Here is the updated project

                            mrjjM Offline
                            mrjjM Offline
                            mrjj
                            Lifetime Qt Champion
                            wrote on last edited by
                            #29

                            @Please_Help_me_D
                            Hi
                            I ran the updated code and it seems to return the same Modelindex for different items so
                            that's why you see the top one also as a child and both get selected if you click on one.
                            So i think something up with internalpointer but could not spot it.

                            It seems like the code from
                            https://doc.qt.io/qt-5/qtwidgets-itemviews-editabletreemodel-example.html
                            But with some difference with the items and handling.

                            Please_Help_me_DP 1 Reply Last reply
                            0
                            • mrjjM mrjj

                              @Please_Help_me_D
                              Hi
                              I ran the updated code and it seems to return the same Modelindex for different items so
                              that's why you see the top one also as a child and both get selected if you click on one.
                              So i think something up with internalpointer but could not spot it.

                              It seems like the code from
                              https://doc.qt.io/qt-5/qtwidgets-itemviews-editabletreemodel-example.html
                              But with some difference with the items and handling.

                              Please_Help_me_DP Offline
                              Please_Help_me_DP Offline
                              Please_Help_me_D
                              wrote on last edited by
                              #30

                              @mrjj thank you!
                              I just created my model based on editabletreemodel and tried to make it as close as possible and it works now.

                              That was the test model. Now I have to create my true model but here is the thing that I cannot tackle.
                              The main difference that was between my test model and editabletreemodel is that editabletreemodel had TreeItem* rootItem where were stored information about column header.
                              I want to have item that has a public variable that doesn't have the default constructor HighFive::File parentFile;.
                              If I do my real model with rootItem to store there information about column header then I will need to somehow initialize HighFive::File parentFile; for rootItem. But rootItem doesn't need to have HighFive::File parentFile; because this is a hdf5 file (I don't need it for columns header).
                              What would you suggest me?
                              I'm afraid to avoid rootItem for header beacause I feel that this is the staff that made my test model useful.

                              mrjjM 1 Reply Last reply
                              0
                              • Please_Help_me_DP Please_Help_me_D

                                @mrjj thank you!
                                I just created my model based on editabletreemodel and tried to make it as close as possible and it works now.

                                That was the test model. Now I have to create my true model but here is the thing that I cannot tackle.
                                The main difference that was between my test model and editabletreemodel is that editabletreemodel had TreeItem* rootItem where were stored information about column header.
                                I want to have item that has a public variable that doesn't have the default constructor HighFive::File parentFile;.
                                If I do my real model with rootItem to store there information about column header then I will need to somehow initialize HighFive::File parentFile; for rootItem. But rootItem doesn't need to have HighFive::File parentFile; because this is a hdf5 file (I don't need it for columns header).
                                What would you suggest me?
                                I'm afraid to avoid rootItem for header beacause I feel that this is the staff that made my test model useful.

                                mrjjM Offline
                                mrjjM Offline
                                mrjj
                                Lifetime Qt Champion
                                wrote on last edited by mrjj
                                #31

                                @Please_Help_me_D

                                Hi
                                If you to stuff HighFive::File parentFile into an item, you can so do that with UserRoles.
                                each item can have extra data stored in user roles.

                                QStandardItem *item = new xxx
                                item ->setData(value, Qt::UserRole + 1)
                                item ->setData(value2, Qt::UserRole + 2)
                                etc

                                where value can be anything , including HighFive::File

                                So you can create and setup parentFile outside model and simply store it there.

                                If that is what you are asking about ?
                                Im not 100% sure what you need.

                                Please_Help_me_DP 3 Replies Last reply
                                1
                                • mrjjM mrjj

                                  @Please_Help_me_D

                                  Hi
                                  If you to stuff HighFive::File parentFile into an item, you can so do that with UserRoles.
                                  each item can have extra data stored in user roles.

                                  QStandardItem *item = new xxx
                                  item ->setData(value, Qt::UserRole + 1)
                                  item ->setData(value2, Qt::UserRole + 2)
                                  etc

                                  where value can be anything , including HighFive::File

                                  So you can create and setup parentFile outside model and simply store it there.

                                  If that is what you are asking about ?
                                  Im not 100% sure what you need.

                                  Please_Help_me_DP Offline
                                  Please_Help_me_DP Offline
                                  Please_Help_me_D
                                  wrote on last edited by
                                  #32

                                  @mrjj thank you for hint for userRole. That is useful.
                                  But also if I add a publica variable of type that doesn't have the default constructor then I must initialaze this variables in constructor. Like:

                                  MyItem::MyItem(QString pathToFile) :
                                      parentFile(HighFive::File(pathToFile)){}
                                  

                                  I need to store parentFile for all items except rootItem (wich is the item for header). So it makes impossible to create rootItem without such hdf5 file.
                                  Or maybe there is some solution how to initialize the object with public variable of type that doesn't have the default constructor?

                                  1 Reply Last reply
                                  0
                                  • mrjjM mrjj

                                    @Please_Help_me_D

                                    Hi
                                    If you to stuff HighFive::File parentFile into an item, you can so do that with UserRoles.
                                    each item can have extra data stored in user roles.

                                    QStandardItem *item = new xxx
                                    item ->setData(value, Qt::UserRole + 1)
                                    item ->setData(value2, Qt::UserRole + 2)
                                    etc

                                    where value can be anything , including HighFive::File

                                    So you can create and setup parentFile outside model and simply store it there.

                                    If that is what you are asking about ?
                                    Im not 100% sure what you need.

                                    Please_Help_me_DP Offline
                                    Please_Help_me_DP Offline
                                    Please_Help_me_D
                                    wrote on last edited by Please_Help_me_D
                                    #33

                                    @mrjj it is so hard being slowpoke as me :D
                                    I needed to add parent item to every child :)

                                    Four days I worked on that I think but finally everything works :)
                                    c4271551-d525-486a-bc1a-4e8eba44dbf5-image.png

                                    1 Reply Last reply
                                    2
                                    • mrjjM mrjj

                                      @Please_Help_me_D

                                      Hi
                                      If you to stuff HighFive::File parentFile into an item, you can so do that with UserRoles.
                                      each item can have extra data stored in user roles.

                                      QStandardItem *item = new xxx
                                      item ->setData(value, Qt::UserRole + 1)
                                      item ->setData(value2, Qt::UserRole + 2)
                                      etc

                                      where value can be anything , including HighFive::File

                                      So you can create and setup parentFile outside model and simply store it there.

                                      If that is what you are asking about ?
                                      Im not 100% sure what you need.

                                      Please_Help_me_DP Offline
                                      Please_Help_me_DP Offline
                                      Please_Help_me_D
                                      wrote on last edited by Please_Help_me_D
                                      #34

                                      @mrjj I implemented QAbstractItemModel::fetchMore(...) to upload data when user click on triangle-button to show more items. It works.
                                      Now I need to do process the data when user click this button to pack (or hide) items. I want to delete infomation from my model when user hides those items (see picture please).
                                      Is there a function that should work when this event happens or a singnal which is emited when userclick on that button hide items?
                                      I thought that QAbstractItemModel::rowsRemoved signal should be emited in such situation but it is not. I tried:

                                      connect(this, &QAbstractItemModel::rowsRemoved, this, &H5Model::pack);
                                      

                                      but there is no signal when I push close-button. Or those signals are abstract and I need to emit them and only then catch?
                                      35e64a56-4447-49af-ae3c-b1fcb7f91a7b-image.png

                                      1 Reply Last reply
                                      0
                                      • M Offline
                                        M Offline
                                        mpergand
                                        wrote on last edited by
                                        #35

                                        void collapsed(const QModelIndex &index)
                                        void expanded(const QModelIndex &index)

                                        Please_Help_me_DP 1 Reply Last reply
                                        3
                                        • M mpergand

                                          void collapsed(const QModelIndex &index)
                                          void expanded(const QModelIndex &index)

                                          Please_Help_me_DP Offline
                                          Please_Help_me_DP Offline
                                          Please_Help_me_D
                                          wrote on last edited by
                                          #36

                                          @mpergand thank you!

                                          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