PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Probleme mit itempos() itemAt() im Scrollbereich



doitux
13-03-2006, 20:18
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.


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


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

anda_skoa
13-03-2006, 20:45
D.h. wenn ich dich richtig verstehe beliebt das Item selbst nicht existent, wird also gelöscht?

Ciao,
_

doitux
13-03-2006, 21:53
nein das Item bleibt erhalten.
Wenn ich aus dem Bereich den man ohne scrollen sehen kann (wie im Bildschirmfoto2.png gezeigt) ein item auswähle (also jemand von "Golschweer, Rabea" bis "Adeli Nijs") dann funktioniert die Refresh-Funktion ohne Probleme.
Wenn ich aber (wie im Bildschirmfoto3.png gezeigt) nach unten scrolle und aus diesem Bereich (also alle nach "Adeli Nijs") ein Item auswähle dann gibts bei der Refresh-Funktion den Speicherzugriffsfehler.

Das witzige ist: wenn ich nach dem Start das Fenster nach unten vergrößere dann verlängert sich der "funktionstüchtige" Bereich bis zu dem Item was man ohne zu scrollen sehen kann (so wie auf dem Bildschirmfoto4.png)

Wo kann da das Problem liegen?

Gruß
doitux

anda_skoa
14-03-2006, 18:00
Wenn das Item bestehen bleibt, kannst du mit ensureItemVisible das Item sichtbar halten

Ciao,
_

doitux
14-03-2006, 19:12
Ich hab mal das probiert:


QPoint position (0,selectedPos);
listView1->ensureItemVisible(listView1->itemAt(position));

wenn das ausgeführt wird sollte er doch auch an diese Position scrollen wenn das im unteren Bereich liegt, oder? Leider passiert das nicht. ensureItemVisible bewirkt bei diesem Beispiel gar nichts.

Du meinst also er hat ein Problem damit ein Item zu selektieren was im scroll-Bereicht liegt. Also was nicht sichtbar ist?

anda_skoa
15-03-2006, 20:53
Ich meinte sowas



QListViewItem* selectedItem = listView->selectedItem();

// .. update, usw.


listView->ensureVisible(selectedItem);


Ciao,
_

doitux
16-03-2006, 00:32
stimmt. So klappts.
Vielen Dank. Du könntest echt n professionellen Qt-Support-Service aufmachen. Da würde ich auch für zahlen.

much thx

anda_skoa
16-03-2006, 19:14
Hehe, danke :)

Unbezahlter Support hat allerdings den Vorteil, daß ich es machen kann wann immer ich Lust habe und auch mal ein paar Tage einfach nix tun kann.

Ciao,
_

doitux
17-03-2006, 18:39
Da hast du allerdings Recht. Ich werde dich auf jedenfall in der README erwähnen.