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.9k 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.
  • TrayonT Offline
    TrayonT Offline
    Trayon
    wrote on last edited by
    #16

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