QListView kopieren und neu füllen
QListView kopieren und neu füllen
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.
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.
Code: Alles auswählen
void XmlParser::getListView(QListView listview)
{
registerListView = new QListView( listview );
}Goos
-
ArneStocker
- Beiträge: 300
- Registriert: 3. November 2004 16:15
- Wohnort: Berlin
Code: Alles auswählen
void XmlParser::getListView(QListView listview)
{
registerListView = new QListView( listview );
}
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
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
schreiben, sondern solltest entweder einen Zeiger oder ggf. Referenz übergeben.
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)
Code: Alles auswählen
void XmlParser::getListView(QListView *pListview)
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?Goos hat geschrieben:Was genau versuchst du hier seltsames zu machen?Code: Alles auswählen
void XmlParser::getListView(QListView listview) { registerListView = new QListView( listview ); }
Goos
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?ArneStocker hat geschrieben:Das sieht so aus, als wolltest Du einen Copy - Konstruktor aufrufen, so funktioniert das mit QListView jedoch nicht.Code: Alles auswählen
void XmlParser::getListView(QListView listview) { registerListView = new QListView( listview ); }
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
Das probier ich morgen mal!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
schreiben, sondern solltest entweder einen Zeiger oder ggf. Referenz übergeben.Code: Alles auswählen
void XmlParser::getListView(QListView listview)
Code: Alles auswählen
void XmlParser::getListView(QListView *pListview)