Seite 1 von 1

Speicherzugriffsfehler bei itemAt() im Scrollbereich

Verfasst: 13. März 2006 13:10
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

Verfasst: 14. März 2006 14:07
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?

Verfasst: 14. März 2006 20:17
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?

Verfasst: 14. März 2006 20:19
von Christian81
Ja, irgendwie schon. sollte man mal mit einer Qt-debug lib schauen... kannst Du ein kleines Testcase machen?

Verfasst: 15. März 2006 07:22
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.

Verfasst: 15. März 2006 10:06
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!