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.
  • TrayonT Trayon

    Yes, that is correct.

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

    @Trayon
    Your Qt installation must be broken then as in a default project
    there cant be any circular dependency.

    invalid use of incomplete type ‘class QAbstractItemModel’

    That error went away ? and now its just
    "explicit QAbstractItemModel(QObject parent = Q_NULLPTR);"
    error: expected ‘)’ before that is left?

    In a clean project, only thing that can be wrong is the Qt files then.
    Did you use Refactor and replace or anything that might have altered the Qt files ?

    And just to be 100% clear,
    you made a new default project with File->New and
    adding #include <QModelIndex>
    to that , gives error ?
    If yes, then reinstall Qt.

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