Speicherzugriffsfehler bei itemAt() im Scrollbereich

Alles rund um die Programmierung mit Qt
Antworten
doitux
Beiträge: 12
Registriert: 21. September 2004 08:15

Speicherzugriffsfehler bei itemAt() im Scrollbereich

Beitrag von doitux »

Hallo

Ich habe hier eine refresh-funktion für eine QListView. Am Anfang der Funktion merke ich mir die Position des ausgewählten Items um das selbe Item am Ende wieder zu selektieren.

Code: Alles auswählen

int selectedPos(0);

if (listView1->selectedItem()!=0) {
   selectedPos = listView1->selectedItem()->itemPos();
}

[...]

QPoint position (0,selectedPos);
listView1->setAllColumnsShowFocus(TRUE);
listView1->setSelected(listView1->itemAt(position) ,TRUE); 
Das klappt im Prinzip auch ganz gut.
ABER:
Inzwischen ist die Liste so voll, dass man mit dem vertikalen Scrollbalken nach unten scrollen muss um die letzten Items zu sehen.
So lange ich die o.g. Refresh-Funktion aufrufe während ein Item in dem oberen Bereich (ohne zu scrollen) selektiert ist, ist alles ok.
Wenn ich aber nach unten scrolle und dann ein Item von unten selektiere und die Refresh-Funktion aufrufe gibts einen Speicherzugriffsfehler in dieser Refresh-Funktion.

Ich hab mir schon mal mit

Code: Alles auswählen

cout << listView1->selectedItem()->itemPos() << "\n";
anzeigen lassen was da raus kommt. Am Anfang kommt 0 dann 18 dann 36 und immer so weiter Vielfache von 18.
Der Versuch mit "QPoint position (0,18);" immer die die 2. Postition manuell anzuwählen endet komischerweise gleich mit einem Speicherzugriffsfehler obwohl das doch auch nur ein int-Wert ist.

Hat jemand eine Idee was ich da falsch mache?

Gruß
doitux
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Warum ist die Refresh-funktionn nötig? Was machst du da? Solange du das selektierte Item nicht aus dem ListView löschst, bleibt es auch selektiert...
Ich schätze mal es ist Qt3, oder?
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
doitux
Beiträge: 12
Registriert: 21. September 2004 08:15

Beitrag von doitux »

In dieser Refresh-Funktion lese ich die Daten aus verschiedenen Dateien aus um sie in die Liste zu sortieren. Mmh aber ich schau mal vielleicht muss das nicht immer sein.
Aber komisch ist dieser Speicherzugriffsfehler schon ... oder?
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Ja, irgendwie schon. sollte man mal mit einer Qt-debug lib schauen... kannst Du ein kleines Testcase machen?
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Beitrag von macman »

doitux hat geschrieben:In dieser Refresh-Funktion lese ich die Daten aus verschiedenen Dateien aus um sie in die Liste zu sortieren. Mmh aber ich schau mal vielleicht muss das nicht immer sein.
Es muss gar nicht sein. Meiner Erfahrung nach wird nach jedem insertItem() ein update() initiiert, so das bei nächster Gelegenheit die Liste neu gemalt wird.
doitux hat geschrieben:Aber komisch ist dieser Speicherzugriffsfehler schon ... oder?
Eigentlich nicht. Du setzt voraus das listView1->itemAt(position) immer ein Item zurück liefert, was wohl nicht der Fall ist. Verlassen würde ich mich auf jeden Fall nicht darauf. Ausserdem solltest Du dir das Item merken, wenn Du das selbe wieder selektieren willst, und nicht die Position. Durch die Umsortierung kann ja durch aus ein anderes Item an der Position sein.

Ach und noch was. Wenn ich mich recht entsinne, bezieht sich itemAt(int,int) auf die Geometrie deiner Liste. Wenn Du ein Item selektieren willst, was sich ausserhalb der Geometrie befindet, wie es eben beim scrollen der Fall ist, wird der Fehler wahrscheinlich hier liegen.
doitux
Beiträge: 12
Registriert: 21. September 2004 08:15

Beitrag von doitux »

Ja, du hast Recht. Ich habe jetzt die Refresh-Funktion aus dem Programm entfernt. Somit gibts jetzt keinen Streß mehr wegen irgendwelchen Positionen.

Danke für alle Hinweise!
Antworten