QListView kopieren und neu füllen

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

QListView kopieren und neu füllen

Beitrag von Notwist »

Habe ein Problem:

Ich will eine XML-Datei in QStrings auslesen und in einer in Designer erstellte ListView anzeigen. Das Auslesen klappt soweit und ich habe in meiner Hauptklasse die ListView an meine XML-Klasse übergeben, damit ich diese dort nutzen kann, das sieht so aus:

void XmlParser::getListView(QListView listview)
{
registerListView = new QListView( listview );
}

Jedermal, wenn ich aber jetzt in meiner Klasse XmlParser über eine Funktion die neuen ListViewItems einfügen will bzw. auch nur irgendwas mit der ListView aller show() oder clear() machen will, schmeisst er mir nen Speicherfehler oder Ähnliches raus. Lasse ich show oder clear weg und bilde einfach per Hand ein neue TopLevelItem, wird es nicht dargestellt.

Hat jemand Erfahrungen und kann mir helfen? Bin in C++ und Q noch etwas frisch, deshalb manchmal ein paar Verständnis-Probleme.

P.S.: Wenn ich in meiner Hauptklasse zB über ein Signal ein paar IOtems einfüge in die ListView, stellt er das ohne Probleme dar.
Goos
Beiträge: 360
Registriert: 17. August 2004 10:10
Wohnort: Black Forest

Beitrag von Goos »

Code: Alles auswählen

void XmlParser::getListView(QListView listview) 
{ 
registerListView = new QListView( listview ); 
}
Was genau versuchst du hier seltsames zu machen? :)

Goos
ArneStocker
Beiträge: 300
Registriert: 3. November 2004 16:15
Wohnort: Berlin

Beitrag von ArneStocker »

Code: Alles auswählen

void XmlParser::getListView(QListView listview) 
{ 
 registerListView = new QListView( listview ); 
} 
Das sieht so aus, als wolltest Du einen Copy - Konstruktor aufrufen, so funktioniert das mit QListView jedoch nicht.

Im Prinzip erzeugst Du ein neues (leeres !!!) Listview, dass Dein altes Listview als Parent hat.

Du müsstest Dir selbst eine Copy - Methode schreiben und innerhalb der Copy- Methode auch alle Items kopieren, wobei mir nicht ganz klar ist, wieso Dein XmlParser ein eigenes View braucht. Vielleicht willst Du nur den inhalt der Items in ein QStringList lesen ?

Gruss Arne
ArneStocker
Beiträge: 300
Registriert: 3. November 2004 16:15
Wohnort: Berlin

Beitrag von ArneStocker »

Apropos Copy - Konstruktor

da es den nicht explizit gibt, wird vom Compiler ein Standard - Copy Konstruktor verwendet, in dem sämtliche Werte (auch Zeiger) einfach 1:1 kopiert werden. Das auf diese Weise erzeugte QListView - Objekt ist dann nicht vernünftig konfiguriert und verweist u.U. auf Speicherbereiche eines anderen (QListView) Objekts. Aus diesem Grunde darfst Du nicht

Code: Alles auswählen

void XmlParser::getListView(QListView listview) 
schreiben, sondern solltest entweder einen Zeiger oder ggf. Referenz übergeben.

Code: Alles auswählen

void XmlParser::getListView(QListView *pListview) 
Notwist
Beiträge: 85
Registriert: 2. März 2005 14:24

Beitrag von Notwist »

Goos hat geschrieben:

Code: Alles auswählen

void XmlParser::getListView(QListView listview) 
{ 
registerListView = new QListView( listview ); 
}
Was genau versuchst du hier seltsames zu machen? :)

Goos
Dachte, ich übergebe meine ListView aus meiner Hauptklasse in die XmlParser-Klasse, um damit dann weiter zu arbeiten und die da zu füllen, da ich mein XML-File in dieser Klasse auslese, das ListView aber ja vom Designer in meiner abgeleiteten Hauptklasse steht. Totaler Denkfehler?
Notwist
Beiträge: 85
Registriert: 2. März 2005 14:24

Beitrag von Notwist »

ArneStocker hat geschrieben:

Code: Alles auswählen

void XmlParser::getListView(QListView listview) 
{ 
 registerListView = new QListView( listview ); 
} 
Das sieht so aus, als wolltest Du einen Copy - Konstruktor aufrufen, so funktioniert das mit QListView jedoch nicht.

Im Prinzip erzeugst Du ein neues (leeres !!!) Listview, dass Dein altes Listview als Parent hat.

Du müsstest Dir selbst eine Copy - Methode schreiben und innerhalb der Copy- Methode auch alle Items kopieren, wobei mir nicht ganz klar ist, wieso Dein XmlParser ein eigenes View braucht. Vielleicht willst Du nur den inhalt der Items in ein QStringList lesen ?

Gruss Arne
Eigentlich will ich nur von meiner Klasse XmlParser mein MainWidget, dass ich in Designer erstellt habe - bestehend aus einer ListView mit anliegender Tabelle zum darstellen der ListView-Childs - mit den neuen ListViewItems füllen, so dass die dann nach zB einem Import-Befehl dort aus einem XML-File dargestellt werden. Wenn ich ein ganz neues ListView erzeuge, dann geht das auch, aber halt nicht in das ListView, das ich vom Designer aus erstellt habe. Ist das verständlich?
Notwist
Beiträge: 85
Registriert: 2. März 2005 14:24

Beitrag von Notwist »

ArneStocker hat geschrieben:Apropos Copy - Konstruktor

da es den nicht explizit gibt, wird vom Compiler ein Standard - Copy Konstruktor verwendet, in dem sämtliche Werte (auch Zeiger) einfach 1:1 kopiert werden. Das auf diese Weise erzeugte QListView - Objekt ist dann nicht vernünftig konfiguriert und verweist u.U. auf Speicherbereiche eines anderen (QListView) Objekts. Aus diesem Grunde darfst Du nicht

Code: Alles auswählen

void XmlParser::getListView(QListView listview) 
schreiben, sondern solltest entweder einen Zeiger oder ggf. Referenz übergeben.

Code: Alles auswählen

void XmlParser::getListView(QListView *pListview) 
Das probier ich morgen mal!
Notwist
Beiträge: 85
Registriert: 2. März 2005 14:24

Beitrag von Notwist »

Ganau daran lag es. Ist ja auch sowas von logisch. Natürlich muss ich den Zeiger auf die ListView übergeben, wie weiss er sonst, dass er sich darauf beziehen soll. Da fehlt manchmal einfach noch die Routine. Danke!
Antworten