Seite 1 von 1

QModellIndex::getInternalPointer liefert krumme Pointer

Verfasst: 9. Februar 2006 12:56
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.

Verfasst: 9. Februar 2006 20:02
von upsala
Ich kanns gerade nicht testen, aber versuch mal statt einem const_cast einen dynamic_cast

Verfasst: 9. Februar 2006 20:33
von CuteCode
Hab alle Casts versucht, dynamic, static, const, ... Keiner brachte das erwartete Ergebnis.

Verfasst: 16. Februar 2006 02:05
von Esleborn
probier mal einen qobject_cast zu einem const FooTreeItem* (schließlich verwendest du auch einen konstanten Index...)

Verfasst: 8. März 2006 17:42
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.