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
    #9

    Did you modify that header at some point ?

    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
    0
    • TrayonT Offline
      TrayonT Offline
      Trayon
      wrote on last edited by
      #10

      Nope. (posts need at least 8 characters)

      mrjjM 1 Reply Last reply
      0
      • TrayonT Trayon

        Nope. (posts need at least 8 characters)

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

        @Trayon

        And your header also looks like this at line 174 ?

        class Q_CORE_EXPORT QAbstractItemModel : public QObject
        {
            Q_OBJECT
        
            friend class QPersistentModelIndexData;
            friend class QAbstractItemViewPrivate;
            friend class QIdentityProxyModel;
        public:
        
            explicit QAbstractItemModel(QObject *parent = Q_NULLPTR);
            virtual ~QAbstractItemModel();
        
            Q_INVOKABLE bool hasIndex(int row, int column, const QModelIndex &parent = QModelIndex()) const;
            Q_INVOKABLE virtual QModelIndex index(int row, int column,
        
        1 Reply Last reply
        0
        • TrayonT Offline
          TrayonT Offline
          Trayon
          wrote on last edited by
          #12

          Correct

          (more than 8 chars)

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