QPtrList übergeben

Alles rund um die Programmierung mit Qt
Antworten
Notwist
Beiträge: 85
Registriert: 2. März 2005 14:24

QPtrList übergeben

Beitrag von Notwist »

Hallo,

wie kann ich ganz einfach eine QPtrList von einer Klasse in eine andere übergeben, so dass die Liste, egal, wo sie geändert wird, auch in der anderen Klasse geändert wird. Muss doch eigentlich mit Pointern gehen:

Im Header der Haupt-Klasse

Code: Alles auswählen

public:
QPtrList<CanData> canDataList;
AddIdentifierFormImpl entry;
Im Header der neuen Klasse

Code: Alles auswählen

public:
void givePtrList(QPtrList<CanData>*); 
private:
QPtrList<CanData> *canDataList;
Erster Aufruf in MainWindowKlasse

Code: Alles auswählen

void KonfiguratorMainWindowImpl::slot_newEntry()
{
	entry.givePtrList(canDataList);
}
In neuer Klasse übernehmen

Code: Alles auswählen

void AddIdentifierFormImpl::givePtrList(QPtrList<CanData> *liste)
{
	canDataList=liste;
}
Müsste doch eigentlich so stimmen. Bei ListViews geht es so. Hat wahrscheinlich was mit der QPtrList-Eigenart zu tun. Er sagt mir dann immer:

entry.givePtrList(canDataList); -> error C2664: 'givePtrList' : cannot convert parameter 1 from 'class QPtrList<class CanData>' to 'class QPtrList<class CanData> *'

Kann mir jemand verraten, wie man es richtig macht?
Gruß, Notwist
Goos
Beiträge: 360
Registriert: 17. August 2004 10:10
Wohnort: Black Forest

Re: QPtrList übergeben

Beitrag von Goos »

Notwist hat geschrieben: Müsste doch eigentlich so stimmen. Bei ListViews geht es so. Hat wahrscheinlich was mit der QPtrList-Eigenart zu tun. Er sagt mir dann
Nein, bei ListViews geht das so ganz sicher auch nicht :)
In givePtrList(QPtrList<CanData> *liste) sagst, du uebergibst einen Pointer. Im Aufruf machst aber ein entry.givePtrList(canDataList) wobei du ein QPtrList<CanData> Objekt uebergibst und nicht die Adresse eines solchen.

Goos
Notwist
Beiträge: 85
Registriert: 2. März 2005 14:24

Beitrag von Notwist »

Also, ich bekomme das schon hin, dass ich das korrigiere und ich die verkettete Liste übergeben kann (auch nicht wirklich durchdacht, sondern so geschrieben, dass das Programm mal startet), aber immer, wenn ich die Liste in die neue Klasse übergebe (mit allen Einträgen aus der übergebenen Klasse richtig übergeben) und dann in der neuen Klasse die Liste fortführe, überschreibt er mir die dort erweiterte Liste dann in der alten Klasse wieder.

Hier, wie ich das versucht habe, bestimmt alles ganz, ganz falsch. :-(

1.) 1 Eintrag in Liste hinzufügen in der Klasse, in der die Liste gebildet wird
Teil vom Header KonfiguratorMainWindowImpl

Code: Alles auswählen

AddIdentifierFormImpl entry;
QPtrList<CanData> canDataList; 
In der Methode

Code: Alles auswählen

void KonfiguratorMainWindowImpl::slot_newEntry()
{
	v_id++;
	canDataList.append(new CanData(v_id, 0)); // nur mal was reinschreiben
	entry.givePtrList(canDataList); // Liste übergeben
}
2.) übergeben der Liste in neue Klasse, um dort Einträge einzugeben
3.) 1 neuen Eintrag, also Anzahl der Einträge = 2

Teil vom Header AddIdentifierFormImpl

Code: Alles auswählen

void givePtrList(QPtrList<CanData>&); / habs mit Zeigern, Referenzen, Kopieren versucht
QPtrList<CanData> canDataList; // auch hier mal als Zeiger oder Referenz probiert
CanData *candata;
In der Methode

Code: Alles auswählen

void AddIdentifierFormImpl::givePtrList(QPtrList<CanData> &liste) // hier jetzt ne Referenz der Liste übergeben, wahrscheinlich Schwachsinn!?
{
	  canDataList = liste;
	  canDataList->append(new CanData(v_identifier, 0)); // hier geht Liste auf EintragAnzhal = 2, wenn aber jetzt wieder slot_newEntry aufgerufen wird, fällt dieser Eintrag weg
}
Könnt Ihr / Du was dazu sagen, bzw. wie man es richtig macht? Übrigens: Das mit ListViews ging so, s. Thread hier im Forum. Wurde selbst so von anderen vorgeschlagen!!!
Gruß, Notwist
Notwist
Beiträge: 85
Registriert: 2. März 2005 14:24

Beitrag von Notwist »

Nebenbei:

Wie kann ich aus einer bestehenden Liste einen Eintrag nach einem Wert durchsuchen und diesen dann ändern?

Sollte dafür nicht die Funktion FIND(...) sein? Irgendwie check ich nie, was ich da übergeben soll in den Klammern und was ich bekomme, soll ja der Zeiger auf das Objekt sein, was er als INT zurückgibt. Dachte mir, ich könnte damit die Liste nach einem speziellen Wert inkl. Variable durchsuchen, er gibt mir den Zeiger auf das Objekt und mit diesem Zeiger kann ich die Variable auslesen bzw. ändern.
Gruß, Notwist
Notwist
Beiträge: 85
Registriert: 2. März 2005 14:24

Beitrag von Notwist »

Habs jetzt mal so gemacht:

Aufruf in der Hauptklasse

Code: Alles auswählen

canDataList=dataEntry.givePtrList(canDataList);
Methode in zu übergebener Klasse:

Code: Alles auswählen

QPtrList<CanData> AddDataFieldFormImpl::givePtrList(QPtrList<CanData> liste)
{
	canDataList=liste;
	addDataField(); // Liste wird bearbeitet
	return canDataList;  // bearbeitete Liste zurückgeben
}
Also in der Klasse, in der die Liste erstellt wurde und in der schon Einträge vorgenommen wurden, rufe ich diese Funktion der neuen Klasse auf & arbeite dann da mit der Liste und gebe sie zurück. Müsste doch gehen oder wird jetzt immer ne neue canDataList erstellt?

Nee, oder? Die wird doch einfach überschrieben!!
Gruß, Notwist
Antworten