Hallo,
ich möchte in einem QTreeWidgetItem einen Pointer auf ein Objekt einer eigenen Klasse speichern, die neben der funktionalen Bezeichnung viele weitere Informationen beinhaltet.
Die hierarische Struktur habe ich mit dem QTreeWidget dargestellt.
Jetzt möchte ich eigentlich nur folgendes:
Ich wähle in dem QTreeWidget ein Item aus und möchte dann den Pointer auf meine Datenklasse erhalten, um in einem weiteren Widget alle weiteren Informationen anzeigen zu können.
Leider konnte ich auch nach studenlanger Recherche weder Beispiele noch Threads finden, wo dieses Thema behandelt wird.
Wäre super, wenn jemand weiter helfen könnte.
QTreeWidget + Pointer auf custom Klasse
Re: QTreeWidget + Pointer auf custom Klasse
Du kannst dafür QTreeWidgetItem::setData bzw.
QTreeWidgetItem::data() verwenden.
In Verbindung mit Regestriertem QVariant:
QTreeWidgetItem::data() verwenden.
In Verbindung mit Regestriertem QVariant:
Code: Alles auswählen
class DeineKlasse {
}
Q_DECLARE_METATYPE(DeineKlasse)
...
DeineKlasse deineKlassenInstance();
TreeWidgetItem.setData(0, Qt::UserRole, QVariant::fromValue(deineKlassenInstance));
...
QVariant var = TreeWidgetItem.data(0, Qt::UserRole);
if (var.canConvert<DeineKlasse >())
{
DeineKlasse x = var.value<DeineKlasse>();
x.eigenschaft();
}
Re: QTreeWidget + Pointer auf custom Klasse
vielen Dank für die Antwort!
Wenn man so vorgeht, wie im Beispielcode von veeman, funktioniert es einwandfrei.
Was hingegen nicht funktioniert ist, wenn man Pointer auf Klassen speichert, also z.B.:
das gibt bei mir folgende Compiler-Fehlermeldung:
...\Qt\Qt5.2.0\5.2.0\mingw48_32\include\QtCore\qmetatype.h
In instantiation of 'int qMetaTypeId() [with T = functionBase*]':
...\Qt\Qt5.2.0\5.2.0\mingw48_32\include\QtCore\qvariant.h:356: required from 'bool QVariant::canConvert() const [with T = functionBase*]'
... .cpp:849: required from here
...\Qt\Qt5.2.0\5.2.0\mingw48_32\include\QtCore\qglobal.h:666: Fehler: invalid application of 'sizeof' to incomplete type 'QStaticAssertFailure<false>'
enum {Q_STATIC_ASSERT_PRIVATE_JOIN(q_static_assert_result, __COUNTER__) = sizeof(QStaticAssertFailure<!!(Condition)>)}
^
...\Qt\Qt5.2.0\5.2.0\mingw48_32\include\QtCore\qglobal.h:671: in expansion of macro 'Q_STATIC_ASSERT'
#define Q_STATIC_ASSERT_X(Condition, Message) Q_STATIC_ASSERT(Condition)
^
...\Qt\Qt5.2.0\5.2.0\mingw48_32\include\QtCore\qmetatype.h:1620: in expansion of macro 'Q_STATIC_ASSERT_X'
Q_STATIC_ASSERT_X(QMetaTypeId2<T>::Defined, "Type is not registered, please use the Q_DECLARE_METATYPE macro to make it known to Qt's meta-object system");
^
Eine Frage noch:
Hast du die Vorgehensweise nur mit Hilfe der Dokumentation herausgefunden?
Wenn man so vorgeht, wie im Beispielcode von veeman, funktioniert es einwandfrei.
Was hingegen nicht funktioniert ist, wenn man Pointer auf Klassen speichert, also z.B.:
Code: Alles auswählen
class DeineKlasse {
}
Q_DECLARE_METATYPE(DeineKlasse)
DeineKlasse * deineKlassenInstance = new DeineKlasse ();
TreeWidgetItem.setData(0, Qt::UserRole, QVariant::fromValue(deineKlassenInstance));
QVariant var = TreeWidgetItem.data(0, Qt::UserRole);
if (var.canConvert<DeineKlasse *>())
{
DeineKlasse * x = var.value<DeineKlasse *>();
x->eigenschaft();
}...\Qt\Qt5.2.0\5.2.0\mingw48_32\include\QtCore\qmetatype.h
...\Qt\Qt5.2.0\5.2.0\mingw48_32\include\QtCore\qvariant.h:356: required from 'bool QVariant::canConvert() const [with T = functionBase*]'
... .cpp:849: required from here
...\Qt\Qt5.2.0\5.2.0\mingw48_32\include\QtCore\qglobal.h:666: Fehler: invalid application of 'sizeof' to incomplete type 'QStaticAssertFailure<false>'
enum {Q_STATIC_ASSERT_PRIVATE_JOIN(q_static_assert_result, __COUNTER__) = sizeof(QStaticAssertFailure<!!(Condition)>)}
^
...\Qt\Qt5.2.0\5.2.0\mingw48_32\include\QtCore\qglobal.h:671: in expansion of macro 'Q_STATIC_ASSERT'
#define Q_STATIC_ASSERT_X(Condition, Message) Q_STATIC_ASSERT(Condition)
^
...\Qt\Qt5.2.0\5.2.0\mingw48_32\include\QtCore\qmetatype.h:1620: in expansion of macro 'Q_STATIC_ASSERT_X'
Q_STATIC_ASSERT_X(QMetaTypeId2<T>::Defined, "Type is not registered, please use the Q_DECLARE_METATYPE macro to make it known to Qt's meta-object system");
^
Eine Frage noch:
Hast du die Vorgehensweise nur mit Hilfe der Dokumentation herausgefunden?
Re: QTreeWidget + Pointer auf custom Klasse
Hatte sowas ähnliches auch schon mal gemacht und hab damals das Internet durchsucht und bin fündig geworden.
Soweit ich weiß funktioniert das nur solange die Klasse kopierbar ist. Da bei der Übergabe eine Kopie erstellt wird.
Der Vorteil bei dieser Vorgehensweise ist, dass die Klasseninstanzen beim entfernen des übergeordneten Objekt automatisch entfernt wird.
Für Pointer sehe ich momentan zwei Möglichkeiten: einmal ne Wrapper-Klasse der man ein Pointer übergibt oder den Pointer in einen 32-Bit bzw 64-Bit integer übergeben und den Wert speichern.
Je nach Methodik muss man ggf. selber schauen das die Instanz auch richtig entfernt wird.
Soweit ich weiß funktioniert das nur solange die Klasse kopierbar ist. Da bei der Übergabe eine Kopie erstellt wird.
Der Vorteil bei dieser Vorgehensweise ist, dass die Klasseninstanzen beim entfernen des übergeordneten Objekt automatisch entfernt wird.
Für Pointer sehe ich momentan zwei Möglichkeiten: einmal ne Wrapper-Klasse der man ein Pointer übergibt oder den Pointer in einen 32-Bit bzw 64-Bit integer übergeben und den Wert speichern.
Je nach Methodik muss man ggf. selber schauen das die Instanz auch richtig entfernt wird.