Help creating a tree that traverses the map of a graph
-
Did you modify that header at some point ?
-
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, -
@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 ?
-
@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. -
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 -
Hi,
You have a QVector of TreeMap object,
thisis a pointer to the current object. -
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_HHi
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-typesomething 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; }; -
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.htmlWhy 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?
-
That example is using a QList of pointer to TreeItem you are using a QVector of TreeMap object.
-
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.htmlWhy 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?
@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)
-
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.
-
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?
-
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.