Inhalt ListWidget löschen

Alles rund um die Programmierung mit Qt
Antworten
nkc
Beiträge: 67
Registriert: 3. November 2008 12:01

Inhalt ListWidget löschen

Beitrag von nkc »

Hallo,

ich benutze ein QListWidget und habe dort ein paar Zeilen Text stehen.
Nun möchte ich mit einem QPushButton die aktuelle (angeklickte) Zeile löschen. Um das zu Realisieren habe ich folgendes getestet.

Code: Alles auswählen

removeItemWidget ( QListWidgetItem * item )
und

Code: Alles auswählen

QListWidgetItem * takeItem ( int row )
Das Problem ist, dass der Parameter aus dem Datentyp int sein soll.
Ich möchte diesen jedoch nicht fest vorgeben, denn es soll ja die angeklickte Zeile (current) gelöscht werden.

Hat jemand eine Idee? Danke.
nkc
Beiträge: 67
Registriert: 3. November 2008 12:01

Beitrag von nkc »

Hallo,
das Problem habe ich folgendermaße gelöst:

Code: Alles auswählen

listWSelected->takeItem(listWSelected->currentRow());
Warum kann man aber die angeklickte Zeile nicht mit der Tastaturtaste entf löschen? Ich habe leider in Doku nichts gefunden.
dontinelli
Beiträge: 146
Registriert: 22. September 2006 20:53

Beitrag von dontinelli »

Dazu musst du den KeyPressEvent des ListWidget (von welchem du eine eigene Klasse ableiten musst) anpassen. Suche in der Doku mal danach, da solltest du etwas finden.
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

dontinelli hat geschrieben:Dazu musst du den KeyPressEvent des ListWidget (von welchem du eine eigene Klasse ableiten musst) anpassen.
Nicht zwingend, mit eventFilter geht das auch.
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag von solarix »

nkc hat geschrieben:Hallo,
das Problem habe ich folgendermaße gelöst:

Code: Alles auswählen

listWSelected->takeItem(listWSelected->currentRow());
...
Ich gehe davon aus, dass du da

Code: Alles auswählen

delete listWSelected->takeItem(listWSelected->currentRow());
geschrieben hast, weil du ja in der Doku bestimmt gelesen hast, dass das Item noch manuell gelöscht werden muss...
dontinelli
Beiträge: 146
Registriert: 22. September 2006 20:53

Beitrag von dontinelli »

@franzf: Hast natürlich recht, mit EventFilter geht es auch.

Alternativ zum Vorschlag von solarix könntest du auch folgendes schreiben

Code: Alles auswählen

listWSelected->removeItemWidget(listWSelected->currentItem());
Damit übernimmt Qt das Löschen des Items. Keine Ahnung, ob das eine oder andere besser geeignet ist (Performance etc.).
nkc
Beiträge: 67
Registriert: 3. November 2008 12:01

eventFilter

Beitrag von nkc »

Also das klappt ganz gut:

Code: Alles auswählen

delete listWSelected->takeItem(listWSelected->currentRow());
Aber mit dem eventFilter kann ich nichts anfangen.
Wo finde ich den und wie kann ich diesen implementieren?
dontinelli
Beiträge: 146
Registriert: 22. September 2006 20:53

Beitrag von dontinelli »

Die Doku hilft wie fast immer weiter: http://doc.trolltech.com/4.4/eventsandfilters.html
nkc
Beiträge: 67
Registriert: 3. November 2008 12:01

Beitrag von nkc »

Danke.

Noch eine Frage:
Ich möchte überprüfen, ob in dem QListWidget eine Zeile angeklickt ist.
Wenn keine angeklickt ist gibt es eine Fehlermeldung mitteil QMessageBox.
Leider finde ich aber im QListWidget keine Methode, die einen boolschen Wert zurückgibt.
Wie kann ich das dann prüfen?
dontinelli
Beiträge: 146
Registriert: 22. September 2006 20:53

Beitrag von dontinelli »

Frage doch currentRow() ab. Sollte auf -1 sein, wenn nichts angewählt ist. Jenachdem kannst du auch selectedItems() aufrufen und die Anzahl der Listeneinträge überprüfen. Kommt drauf an, was du für einen Selektionsmodus eingestellt hast.
nkc
Beiträge: 67
Registriert: 3. November 2008 12:01

Beitrag von nkc »

Das tut genau das, was ich wollte. Vielen Dank.

Ich habe die ganze Zeit nach einer Methode gesucht,
die true oder false zurückliefert.

Wie kann ich das aber der Dokumentation entnehmen.
Dort steht nichts von -1 geschrieben, oder?
Ich habe hier nachgeschaut:
http://web.mit.edu/qt-dynamic/www/qlist ... ntRow-prop
dontinelli
Beiträge: 146
Registriert: 22. September 2006 20:53

Beitrag von dontinelli »

Hast recht, dort steht es nicht. Bei anderen Widgets ist es jedoch so beschrieben. Funktionen mit Pointern als Rückgabewerdte geben in solchen Fällen einen Null-Pointer zurück und solche mit int eine -1. Und Count/Size natürlich 0.
Ich hoffe mal, diese Verallgemeinerung stimmt *g*.
Ich bin auf jeden Fall immer gut verfahren damit...
Antworten