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 mrjj

    @Please_Help_me_D
    well
    you return parentItem->children.size()
    and that is zero as it has no children :)

    So not sure if this is a tree or list or table model ?

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

    @mrjj it should be tree model

    mrjjM 1 Reply Last reply
    0
    • Please_Help_me_DP Please_Help_me_D

      @mrjj it should be tree model

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

      @Please_Help_me_D
      Then you should add more than the first item :)
      So the root item does have children.

      Please_Help_me_DP 1 Reply Last reply
      0
      • mrjjM mrjj

        @Please_Help_me_D
        Then you should add more than the first item :)
        So the root item does have children.

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

        @mrjj Well I add few children to item:

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

        but it still doesn't work :)

        mrjjM 1 Reply Last reply
        0
        • Please_Help_me_DP Please_Help_me_D

          @mrjj Well I add few children to item:

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

          but it still doesn't work :)

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

          @Please_Help_me_D
          so check with debugger what you return as rowCount ?

          Please_Help_me_DP 2 Replies Last reply
          0
          • mrjjM mrjj

            @Please_Help_me_D
            so check with debugger what you return as rowCount ?

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

            @mrjj I wrote:

            int MyModel::rowCount(const QModelIndex &parent) const
            {
                if (!parent.isValid()) {
                    qDebug() << "Item size: " << _items.size();
                    return _items.size();
                }
                const MyItem* parentItem = static_cast<const MyItem*>(parent.internalPointer());
                qDebug() << "Children size: "  << parentItem->children.size();
                return parentItem->children.size();
            }
            

            The output is:

            Item size:  1
            Item size:  1
            Item size:  1
            Item size:  1
            Item size:  1
            Item size:  1
            Item size:  1
            Item size:  1
            Item size:  1
            Item size:  1
            Item size:  1
            Item size:  1
            Children size:  2
            Item size:  1
            Item size:  1
            Item size:  1
            Item size:  1
            Item size:  1
            Item size:  1
            Children size:  2
            Item size:  1
            Item size:  1
            Item size:  1
            

            Why the program goes to rowCount so many times? I already suspected that when I set the breakpoint and tried to contue application run to next breakpoint. Is it normal?

            JonBJ 1 Reply Last reply
            0
            • Please_Help_me_DP Please_Help_me_D

              @mrjj I wrote:

              int MyModel::rowCount(const QModelIndex &parent) const
              {
                  if (!parent.isValid()) {
                      qDebug() << "Item size: " << _items.size();
                      return _items.size();
                  }
                  const MyItem* parentItem = static_cast<const MyItem*>(parent.internalPointer());
                  qDebug() << "Children size: "  << parentItem->children.size();
                  return parentItem->children.size();
              }
              

              The output is:

              Item size:  1
              Item size:  1
              Item size:  1
              Item size:  1
              Item size:  1
              Item size:  1
              Item size:  1
              Item size:  1
              Item size:  1
              Item size:  1
              Item size:  1
              Item size:  1
              Children size:  2
              Item size:  1
              Item size:  1
              Item size:  1
              Item size:  1
              Item size:  1
              Item size:  1
              Children size:  2
              Item size:  1
              Item size:  1
              Item size:  1
              

              Why the program goes to rowCount so many times? I already suspected that when I set the breakpoint and tried to contue application run to next breakpoint. Is it normal?

              JonBJ Online
              JonBJ Online
              JonB
              wrote on last edited by
              #14

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

              Why it gives me such many outputs?

              Because your rowCount() gets called by Qt (e.g. the QTreeView) more times than you think it does :)

              Please_Help_me_DP 1 Reply Last reply
              0
              • JonBJ JonB

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

                Why it gives me such many outputs?

                Because your rowCount() gets called by Qt (e.g. the QTreeView) more times than you think it does :)

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

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

                JonBJ 1 Reply Last reply
                0
                • mrjjM mrjj

                  @Please_Help_me_D
                  so check with debugger what you return as rowCount ?

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

                  @mrjj maybe I should manually insert rows somehow?

                  1 Reply Last reply
                  0
                  • 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 Online
                          JonBJ Online
                          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 Online
                                      JonBJ Online
                                      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

                                          • Login

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