Seite 1 von 1

Datenstrukturen für ListViews & ListViewItems - aber wie

Verfasst: 12. April 2005 12:51
von Notwist
Hallo Leute,

ich brauche mal wieder Eure Hilfe.

Ich arbeite ja mit zwei ListViews (Input & Output), in die ListViewItems integriere und diese abändere. Natürlich habe ich das Pferd von der falschen Seite aufgesäumt und habe nicht beachtet, dass die ListView keine wirkliche Datenstruktur ist, die ich dann verarbeiten und abändern kann (in C++ übrigens). Wie geh ich das jetzt am besten an? Ich muss ja wahrscheinlich eine Datenstruktur von Arrays und/oder verketteten Listen haben. Meine Klassen für die Einträge sehen zB so aus:

Code: Alles auswählen

class CanId  
{
public:
	CanId();
	~CanId();

protected:
	int identifier;
	IdData data_field[8];
};

class IdData  
{
public:
	IdData();
	~IdData();

protected:
	union DataFieldType
	{
		char c_val;
		short sh_val;
		long l_val;
	} d_type;
	char byte_pos;
	int reg_nr;
	bool big_endian;
};
Mein Instanz vom Typ CanId ist der Haupteintrag im ListView (max. 2048 Objekte, die 11 Bit lang sind), davon abhängig dann 8 Datafelder (1 Feld max. 32 Bit, kleinstes 8 Bit, insgesamt 64 Bit lang -> Instanz von IdData), die unterschiedlicher Natur sein können (long, short, char -> UNION) & jedes DataField hat noch zusätzliche Informationen, die zB dann auch in die ListView sollen. Nur habe ich nicht so die Erfahrungen mit Datenstrukturen. Kann ich jetzt eine Klasse schaffen, die von QListView erbt oder erbt sie von der Klasse, die meine Einträge in die GUI schreibt? Die erbende Klasse besitzt ja auch alle Objekte der vererbenden Klasse, also auch die, die während des Programmverlaufs geschaffen werden. Ich müsste ja auch irgendwie immer, wenn ich ein Objekt in meiner Datenstruktur über die GUI schaffe, auch eines in die GUI schreiben oder sollte man eher eine Update-Funktion schreiben, die die Datenstruktur nach Objekten durchsucht und diese dann einfügt (wie macht man das? Stichwort: Referenzen). Ich steh gerade aufgrund der Vielzahl der Möglichkeiten und der mich daher überwältigenden Schwierigkeiten etwas auf dem Schlauch. Vielleicht könnt ich mir ein paar Tipps geben?!

Notwist

Verfasst: 13. April 2005 08:42
von Goos
Hi Notwist,

du muesstest doch mittlerweile schon wissen, dass man hier einfach nur moeglichst simpel und verstaendlich sein Problem schildern sollte ;)

Also eher so die Gliederung - deine Datenstruktur, was du damit machen willst, wie deine bisherigen Gedanken dazu sind und nicht alles irgendwie mischen, das kapiert sonst keiner :)

Goos

Verfasst: 13. April 2005 11:38
von Notwist
Datenstruktur

2 Datentrees:
Input & Output (wobei der eine die kompliziertere Datenstruktur hat, von der wir jetzt mal ausgehen -> Output)

Output (zB ein Objekt, ein ListViewItem) besitzt

-> Identifierwert (11 Bit Datenwort, max. 2048 Einträge)

jeder Identifierwert besitzt ein

-> Datenfeld (64 Bit Datenwort, bestehend aus einzelnen Blöcken von unterschiedlichen Typen (char, short, long), wobei der kleinste Block 8 Bit, der größte 32 Bit groß sein darf; also max. 8 Einzeldatenwörter 8 Bit lang, weil 8x8 = 64 Bit (zB. char), minimal 2 Einzeldatenwörter 32 Bit lang (zB long)

ein Block besitzt die Informationen

-> Byteposition des Blockes im Datenfeld (0-7 -> char)
-> RegisterNummer der InputDaten (30000 - 39999 -> int)
-> BigEndian oder LittleEndian (0-1 -> bool)

Also von jedem Typ Output kann es 2048 Einträge geben, in dem die Info "Identifierwert" steht & jeder davon hat ein 64 Bit Datenwort, das in Blöcke unterteilt ist. Jeder Block hat die Info "Byteposition", "Registernummer", "EndianTyp".

Weiss nicht, wie ich es einfacher beschreiben kann. Hoffe, es ist verständlich.

Gruß, Notwist

Verfasst: 14. April 2005 08:51
von Goos
Hi Notwist,

deine Datenstruktur hab ich nun gesehen und verstanden.
Wie war deine Frage, oder dein konkretes Problem damit nochmal?

Goos

Verfasst: 14. April 2005 14:18
von Notwist
Frage:
Wie man solch eine Datenstruktur mit Qt/C++ verwirklicht?! Also von der GUI zur Datenstruktur und umgekehrt. Als Beispiel dachte ich mir dass, wenn ich ein ListViewItem über die GUI hinzufüge, soll er mir in derselben Funktion auch einen Eintrag mit den Werten in meine verkettete Liste schreiben, was dann der erste Teil meiner Datenstruktur ist, mit der ich weiterarbeiten kann (zB ob Input oder Output + Iddentifier-Wert). Geht das so?

Nochmal zur Datenstruktur:

Dachte mir, ich schreibe mir meine Klassen, von denen ich dann meine Datenstruktur baummäßig aufbaue.

Sprich:

Code: Alles auswählen

class CanId  
{
public:
	CanId();
	~CanId();

public:
	int identifier;
	IdData data_field[8]; // vielleicht dynamisch mit ner Liste
};

class IdData  
{
public:
	IdData();
	~IdData();

protected:
	union DataFieldType
	{
		char c_val;
		short sh_val;
		long l_val;
	} d_type;
	char byte_pos;
	int reg_nr;
	bool big_endian;
};
Bzw. eine verkettete Liste vorangestellt mit der Info "Identifier" und "setAsInput".

Habe nur immer Probleme damit, Daten, GUI-Elemente etcpp. , die ich in einer Basisklasse gebildet habe, dann in andere Klassen zu "transferieren" und wenn ich sie dann dort ändere, sie auch für alle anderen Klassen geändert sind. Siehe zB mein Problem mit der QPtrList.

Irgendwie habe ich den objektorientierten Gedanken noch nicht ganz verinnerlicht.