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. Help creating a tree that traverses the map of a graph
Qt 6.11 is out! See what's new in the release blog

Help creating a tree that traverses the map of a graph

Scheduled Pinned Locked Moved Solved General and Desktop
26 Posts 4 Posters 7.8k 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.
  • SGaistS Offline
    SGaistS Offline
    SGaist
    Lifetime Qt Champion
    wrote on last edited by
    #17

    Hi,

    You have a QVector of TreeMap object, this is a pointer to the current object.

    Interested in AI ? www.idiap.ch
    Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

    1 Reply Last reply
    2
    • TrayonT Trayon

      Reinstalled QT. Thanks for that tip. It got rid of those errors, but now I'm getting something a bit odd.

      The error I got was:
      no matching function for call to ‘QVector<TreeMap>::indexOf(const TreeMap)’*

      Here:

      int TreeMap::nodeIndex() const
      {
          if (parent)
              return parent->nodes.indexOf(this);
      
          return 0;
      }
      

      Here's TreeMap.h for reference:

      #ifndef TREEMAP_H
      #define TREEMAP_H
      #include <QString>
      #include <QVector>
      
      class TreeMap
      {
      public:
          TreeMap(QString name, TreeMap *parentNode = 0);
          ~TreeMap();
      
          TreeMap nodeAt(int position) const;
          int nodeCount() const;
          QString data() const;
          bool insertNode(int position);
          TreeMap* getParent();
          bool removeNode(int position);
          int nodeIndex() const;
          bool setData(const QString &value);
      
      private:
          QString nodeName;
          QVector<TreeMap> nodes;
          TreeMap *parent;
      };
      
      #endif // TREEMAP_H
      
      
      mrjjM Offline
      mrjjM Offline
      mrjj
      Lifetime Qt Champion
      wrote on last edited by
      #18

      Hi

      nodes.indexOf(this);

      "This" is a const TreeMap *
      but it wants a &
      int indexOf(const T &t, int from = 0) const;

      so you can do

      int TreeMap::nodeIndex() const {
      nodes.indexOf(*this);
      }

      However, QVector wants an assignable data type so you will need some extra functions
      http://doc.qt.io/qt-5/containers.html#assignable-data-type

      something like (stripped down)

      class TreeMap {
      public:
        TreeMap(QString name, TreeMap* parentNode = 0) {}
        int nodeIndex() const;
        TreeMap(const TreeMap& other) {/* IMPLEMENT*/}
        TreeMap& operator=(const TreeMap& other) {/* IMPLEMENT*/}
        bool operator==(const TreeMap& other) {/* IMPLEMENT*/} // most likely wants this too
      private:
        QVector<TreeMap> nodes;
      };
      
      
      1 Reply Last reply
      2
      • TrayonT Offline
        TrayonT Offline
        Trayon
        wrote on last edited by
        #19

        Thanks mrjj.

        A few more things to add. You most likely know I'm following the example here:
        http://doc.qt.io/qt-5/qtwidgets-itemviews-editabletreemodel-example.html

        Why is it that the example doesn't implement these functions? QList has the same shortcoming as QVector when I tried changing it. Also, should I start a new thread with the new errors that pop up in my program, or should I continue posting here as they come?

        mrjjM 1 Reply Last reply
        0
        • SGaistS Offline
          SGaistS Offline
          SGaist
          Lifetime Qt Champion
          wrote on last edited by
          #20

          That example is using a QList of pointer to TreeItem you are using a QVector of TreeMap object.

          Interested in AI ? www.idiap.ch
          Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

          1 Reply Last reply
          1
          • TrayonT Trayon

            Thanks mrjj.

            A few more things to add. You most likely know I'm following the example here:
            http://doc.qt.io/qt-5/qtwidgets-itemviews-editabletreemodel-example.html

            Why is it that the example doesn't implement these functions? QList has the same shortcoming as QVector when I tried changing it. Also, should I start a new thread with the new errors that pop up in my program, or should I continue posting here as they come?

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

            @Trayon
            Hi
            The main difference with the sample is that it uses pointers.
            QList<TreeItem*>
            So it can just compare pointers. ( they are assignable-data-type by nature)

            You are use a class directly so it need you to tell it how to compare etc.
            since it cannot know what members inside that should be used.

            like if we have
            class Car {
            QString Model;
            }

            if we have
            Car *A = new Car;
            and
            Car *B = new Car;
            we can say if ( A == B ) and it compiler can just check is the memory address is the same.
            But if we do
            Car A;
            Car B;
            and say if ( A == B )
            then what should it compare.
            we can then "explain it" to the compiler with
            if ( A.model == B.model )
            and that is what we do with
            operator==(..)

            @SGaist (hehe ninjaed)

            1 Reply Last reply
            1
            • TrayonT Offline
              TrayonT Offline
              Trayon
              wrote on last edited by
              #22

              Yes, but as I said, I tried changing it to QList, and it had the same shortcomings. Down the error line, I even saw the "no match for '=='" error for QList as well.

              mrjjM 1 Reply Last reply
              0
              • TrayonT Trayon

                Yes, but as I said, I tried changing it to QList, and it had the same shortcomings. Down the error line, I even saw the "no match for '=='" error for QList as well.

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

                @Trayon
                Yes, as explained it dont know how to compare your class when its NOT pointers.

                1 Reply Last reply
                0
                • TrayonT Offline
                  TrayonT Offline
                  Trayon
                  wrote on last edited by
                  #24

                  Okay, that explains a lot. Thank you guys for all the help. When I get errors in this project down the line, should I revive this thread, or start a new one?

                  mrjjM 1 Reply Last reply
                  0
                  • TrayonT Trayon

                    Okay, that explains a lot. Thank you guys for all the help. When I get errors in this project down the line, should I revive this thread, or start a new one?

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

                    @Trayon
                    Best with new post with good title so its not mega posts :)

                    1 Reply Last reply
                    0
                    • mrjjM Offline
                      mrjjM Offline
                      mrjj
                      Lifetime Qt Champion
                      wrote on last edited by
                      #26

                      Just as a last note:
                      You can also use
                      std::vector<TreeMap> nodes;
                      Which can "just work" with your TreeMap since its members
                      QString nodeName;
                      TreeMap *parent;

                      Is just copyable but mind the parent pointer as it will just copy it as raw pointer and
                      it might not be what you want/need.

                      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