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 8.0k 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.
  • mrjjM Offline
    mrjjM Offline
    mrjj
    Lifetime Qt Champion
    wrote on last edited by
    #13

    @Trayon said in Help creating a tree that traverses the map of a graph:

    #include <QModelIndex>

    And you get error by simply including this in a default GUI project ?

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

      Yes, that is correct.

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