Angezeigte Texte in QListWidget ändern sich nicht

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
tcpipguy
User
Beiträge: 4
Registriert: Freitag 14. August 2009, 14:04

Hallo,

endlich bin auf die Idee gekommen, mal nach nem deutschen Python-Forum zu suchen, fragt sich doch gleich viel leichter :)

Ich bin gerade dabei, mich in PyQt einzuarbeiten, und komme bei einem Problem absolut nicht weiter.
Der Benutzer kann in meiner Anwendung Fragen für einen Multiple-Choice-Test erstellen, inklusive der Antworten und noch ein wenig mehr Schnickschnack. Durch die Liste der Fragen hangelt er sich, indem er entweder die Vor-/Zurück-Buttons nimmt, oder in einem QListWidget die Frage per Doppelklick auswählt. Dazu muss ich nun aber erstmal das QListWidget befüllen, worin das Problem liegt.

Der grundlegende Ablauf ist folgendermaßen:

Code: Alles auswählen

def nextQuestion(self):
    if self.saveCurrentQuestion():
        self.updateListWidget()
        self.currentPosition += 1
        self.updateEditorWidgets()
saveCurrentQuestion überprüft, ob bestimmte Bedingungen erfüllt sind, und fügt dann die Frage an der currentPosition in eine Liste ein. Dann soll das QListWidget aktualisiert werden. Die Funktion sieht so aus:

Code: Alles auswählen

def updateListWidget(self):
    text = str(self.questionList[self.currentPosition].question)
    if self.questionListWidget.count() == 0 or self.questionListWidget.count() == self.currentPosition:
        self.questionListWidget.addItem(self.tr(text))
    else:
        self.questionListWidget.item(self.currentPosition).setText(self.tr(text))
text enthält die aktuelle Frage. Wenn das Widget leer ist oder wir uns am Ende der Frageliste befinden, wird einfach ein QListWidgetItem angehängt. Das funktioniert auch einwandfrei.

Jetzt endlich zum eigentlichen Problem. Der Code im else-Zweig macht nicht, was ich möchte. Ich bin im Endeffekt nur daran interessiert, auf welche Zeile der Anwender geklickt hat, daher war mein Gedanke, einfach den angezeigten Text von der alten Frage auf die neue zu ändern. Der Code oben zeigt aber keinerlei Auswirkungen. Ich habe es überprüft, die Frage in der questionList wird definitiv geändert, wenn ich aber nach setText durch die items iteriere und mir den Text ausgeben lasse, hat er sich nicht geändert.

Ich möchte lediglich den angezeigten Text ändern, damit der Anwender die geänderte Frage sieht. Wenn er sie dann per Doppelklick auswählen sollte, interessiert mich lediglich die Zeile, damit ich currentPosition entsprechend setzen kann.
Wie lässt sich also der Text eines QListWidgetItem ändern und die Änderung anzeigen?
vorlautboy
User
Beiträge: 38
Registriert: Sonntag 7. Dezember 2008, 18:43

tcpipguy hat geschrieben:Wie lässt sich also der Text eines QListWidgetItem ändern und die Änderung anzeigen?
QListWidget.item.setText ist schon richtig. Kann es sein, dass du in "nextQuestion" die Zeile "self.currentPosition += 1" vor "self.updateListWidget" stellen musst?
tcpipguy
User
Beiträge: 4
Registriert: Freitag 14. August 2009, 14:04

Danke für die Antwort. Das setText der richtige Weg sein sollte, hab ich nach dem Lesen der Doku schon vermutet, nur leider tut sich nix.

currentPosition ist lediglich ein Index und von der Logik schon ok da. Ich ändere die Frage an Position curPos in der Liste, und muss dann den entsprechenden Eintrag im ListWidget ändern. Danach erhöhe ich den Index um eins und zeige im Editor die nächste Frage an (updateEditor).

Und selbst wenn ich da nen Fehler hätte, würde doch lediglich der falsche Eintrag geändert werden, oder?

Woran könnte es denn liegen, dass das ListWidget die Änderungen mal eben ignoriert? Wie gesagt, wenn ich mir alle Texte ausgeben lasse nach der "Änderung", ist nur zu sehen, dass die alten Texte erhalten geblieben sind.
Hiermit hab ich das überprüft:

Code: Alles auswählen

for i in range(self.questionListWidget.count()):
    print( str( self.questionListWidget.item(i).text() ) )
Das wird einmal vor und einmal nach dem setText ausgeführt und zeigt keine Änderung an.
vorlautboy
User
Beiträge: 38
Registriert: Sonntag 7. Dezember 2008, 18:43

Hi,
Das setText der richtige Weg sein sollte, hab ich nach dem Lesen der Doku schon vermutet, nur leider tut sich nix.
Es ist der richtige Weg... es hilft dir zwar leider nichts, aber bei mir klappts so...

Code: Alles auswählen

def updateListWidget(self):
    text = str(self.questionList[self.currentPosition].question)
    if self.questionListWidget.count() == 0 or self.questionListWidget.count() == self.currentPosition:
        self.questionListWidget.addItem(self.tr(text))
    else:
        self.questionListWidget.item(self.currentPosition).setText(self.tr(text))
Falls "text" vor der if-Abfrage wirklich eine neue Frage beinhaltet, müsste diese auch gegen die alte ausgetauscht werden.

Versuche den Code mal auf das wesentliche zu reduzieren, also nur auf das, was für diesen Schritt notwendig ist, um mögliche Fehler in einer ganz anderen Ecke des Codes auszuschalten.
Oder poste etwas mehr Code.
tcpipguy
User
Beiträge: 4
Registriert: Freitag 14. August 2009, 14:04

Danke, es funzt jetzt. Deine Kommentare haben dafür gesorgt, mir nochmal die Fragenliste genauer anzusehen, und es stellte sich heraus, dass ich die ganzen Manipulationen an der falschen Liste vorgenommen hatte.

Merke: Attribute und temporäre lokale Variablen sollten nicht den gleichen Namen haben, so ein fehlendes self. übersieht man manchmal eben leider doch.

Dummer Fehler, ärgert mich ein wenig, denn der hat mich viel Zeit gekostet, aber naja. Danke für deine Anregungen :)
Antworten