Seite 1 von 1
QListView kopieren und neu füllen
Verfasst: 31. März 2005 16:20
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.
Verfasst: 31. März 2005 17:55
von Goos
Code: Alles auswählen
void XmlParser::getListView(QListView listview)
{
registerListView = new QListView( listview );
}
Was genau versuchst du hier seltsames zu machen?
Goos
Verfasst: 31. März 2005 18:00
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
Verfasst: 31. März 2005 18:08
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
schreiben, sondern solltest entweder einen Zeiger oder ggf. Referenz übergeben.
Verfasst: 1. April 2005 00:30
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?
Verfasst: 1. April 2005 00:34
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?
Verfasst: 1. April 2005 00:35
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
schreiben, sondern solltest entweder einen Zeiger oder ggf. Referenz übergeben.
Das probier ich morgen mal!
Verfasst: 1. April 2005 12:43
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!