QModellIndex::getInternalPointer liefert krumme Pointer

Alles rund um die Programmierung mit Qt
Antworten
CuteCode
Beiträge: 2
Registriert: 9. Februar 2006 12:43

QModellIndex::getInternalPointer liefert krumme Pointer

Beitrag von CuteCode »

Hallo!

Habe ein sehr seltsamen Problem...

Wenn ich ueber QModellIndex auf ein Item in einem TreeView zugreife, passieren seltsame Dinge.

Ich habe ein TreeItem (wie aus den Beispiel Codes in der Dokumentation),
und ein FooTreeItem, welche von TreeItem abgelitten ist...

Wenn ich das ganze so verwende, funktionert alles Problemlos (getInteralPointer von QModellIndex liefert mir den richtigen Pointer).

Wenn ich jedoch FooTreeItem jetzt jedoch auch noch von QObject ableite (und natuerlich das Q_OBJECT Macro setze), dann liefert mir getInternalPointer einen falschen Pointer, er zeigt naemlich exakt 8 Bytes zu weit.

Code: Alles auswählen

FooTreeItem* MyWidget::getFooTreeItemAtIndex(const QModelIndex & index) {
	
	FooTreeItem *item = const_cast<FooTreeItem*>(index.internalPointer());

	// warum zeigt der pointer hier 8 byte zu weit?!

	fprintf(stderr, "achtung - hier passieren enorm ekelhaftige dinge!\n");
	item = (FooTreeItem *)(((char*)item) - 8);

	return item;
}
Wenn ich diese Funktion verwende um mir den Pointer zu holen, bekomme ich den richtigen Pointer... Sehr mysterioes das ganze...

Hat jemand eine Idee was hier schief laeuft?

P.S.: Wenn ich TreeItem von QObject ableite funktioniert auch alles Problemlos, das ist im Moment mein Workaround.
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Ich kanns gerade nicht testen, aber versuch mal statt einem const_cast einen dynamic_cast
CuteCode
Beiträge: 2
Registriert: 9. Februar 2006 12:43

Beitrag von CuteCode »

Hab alle Casts versucht, dynamic, static, const, ... Keiner brachte das erwartete Ergebnis.
Esleborn
Beiträge: 265
Registriert: 27. Januar 2005 01:23
Wohnort: Baden-Würtenberg
Kontaktdaten:

Beitrag von Esleborn »

probier mal einen qobject_cast zu einem const FooTreeItem* (schließlich verwendest du auch einen konstanten Index...)
Glaube an eine Lösung, nur dann kannst du auch eine finden.
Psychodad
Beiträge: 15
Registriert: 26. November 2005 07:30

Beitrag von Psychodad »

Was ist der internalPointer? Worauf zeigt er? Wie setzt bzw. verändert man ihn? Wer wertet ihn aus (außer der eigenen Kllasse)?

Mein Ziel ist es ein QAbstractItemModel abzuleiten das nicht auf Items, sondern auf Container (QMap und QHash) verweist. Dazu würde ich gern den InternalPointer auf ein Element in den Containern umbiegen.
Antworten