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