QTableWidget - Inhalt wird nicht angezeigt

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
scoob99
User
Beiträge: 17
Registriert: Montag 10. Juni 2013, 17:15

Hi alle zusammen,

ich bin gerade dabei mir eine Filmdatenbank mit Ausgabe in einem UI zu erstellen.
Die Daten aus der Datenbank sollen in eine Tabelle geschrieben werden.
Mein Problem ist, dass die Tabelle zwar um entsprechende Zeilen erweitert wird, jedoch die einzelnen Zellen keinen Inhalt anzeigen.
Hier mal der Code zu der (vermutlich fehlerhaften) Stelle:

Code: Alles auswählen

rowCount = 0
for title, fsk, length, year, genre, performer, medium in cursor.execute('SELECT title, fsk, length, year, genre, performer, medium FROM movies'):
    rowCount = rowCount+1
    self.tableWidget.setRowCount(rowCount)

    item = QtGui.QTableWidgetItem()
    self.tableWidget.setItem(rowCount, 0, item)
    item.setText(title)
    item = QtGui.QTableWidgetItem()
    self.tableWidget.setItem(rowCount, 1, item)
    item.setText(fsk)
    item = QtGui.QTableWidgetItem()
    self.tableWidget.setItem(rowCount, 2, item)
    item.setText(length)
    item = QtGui.QTableWidgetItem()
    self.tableWidget.setItem(rowCount, 3, item)
    item.setText(year)
    item = QtGui.QTableWidgetItem()
    self.tableWidget.setItem(rowCount, 4, item)
    item.setText(genre)
    item = QtGui.QTableWidgetItem()
    self.tableWidget.setItem(rowCount, 5, item)
    item.setText(performer)
    item = QtGui.QTableWidgetItem()
    self.tableWidget.setItem(rowCount, 6, item)
    item.setText(medium)
Ich hoffe jemand von euch kann mir sagen, was ich falsch mache.
Danke schon mal im voraus.
EmaNymton
User
Beiträge: 174
Registriert: Sonntag 30. Mai 2010, 14:07

Ich würde jetzt mal spontan darauf tippen, dass du mit der Methode setRowCount() alles wieder überschreibst, ich denke du willst auch gar nicht setRowCount() innerhalb deiner Schleife verwenden, sondern eher insertRows(). Ansonsten würde ich nach der DB Abfrage einmal die Anzahl der Reihen bestimmen und vorher mit setRowCount festlegen und ann die QTableWidgetItems setzen.

Du kannst übrigens auch den Text, den das QTableWidgetItem haben soll, direkt beim Erzeugen als Parameter übergeben, damit wird der ganze Quelltext wesentlich kürzer.
scoob99
User
Beiträge: 17
Registriert: Montag 10. Juni 2013, 17:15

Danke für die schnelle Antwort und den Tipp mit dem kürzen des Quelltextes.

Wegen dem bestimmen der Zeilenanzahl und des festlegens außerhalb der Schleife, ändert leider nichts an dem Problem. Es werden trotzdem keine Inhalte in den Zellen angezeigt.
Meine Kenntnisse was die Erstellung von Tabellen mit Python angeht, die sind eher gering. Könntest du mir vielleicht sagen, wie ich insertRows() integrieren kann/muss, damit dass vielleicht mein Problem beheben kann?
EmaNymton
User
Beiträge: 174
Registriert: Sonntag 30. Mai 2010, 14:07

http://qt-project.org/doc/qt-4.8/qtable ... #insertRow

Du musst insertRow noch die Zeile übergeben, wo die neue Zeile eingefügt werden soll. Ansonsten würde ich noch prüfen, ob die Abfrage überhaupt was zurückliefert.

Ich persönlich würde auch eher die DB-Abfrage machen, dann die Anzahl an Zeilen setzen, die du ja dann weißt und danach die Items setzen.
scoob99
User
Beiträge: 17
Registriert: Montag 10. Juni 2013, 17:15

insertRow() fügt lediglich eine weitere Zeile an die Tabelle, ändert aber nichts am Problem.
Die Abfrage habe ich bereits geprüft, die Daten sind da.

EmaNymton hat geschrieben:Ich persönlich würde auch eher die DB-Abfrage machen, dann die Anzahl an Zeilen setzen, die du ja dann weißt und danach die Items setzen.
Was meinst du damit? Das hab ich doch so gemacht oder versteh ich da gerade was falsch?
EmaNymton
User
Beiträge: 174
Registriert: Sonntag 30. Mai 2010, 14:07

Nein, du iterierst ja direkt über die DB-Abfrage. Du kannst aber die DB-Abfrage vorher machen:
ungetestet!

Code: Alles auswählen

cursor.execute('SELECT title, fsk, length, year, genre, performer, medium FROM movies')
self.tableWidget.setRowCount(cursor.rowcount)
for row, data in enumerate(cursor):
    for column, item in enumerate(data):
        self.tableWidget.setItem(row, column, QtGui.QTableWidgetItem(item))
Wie sieht denn dein vorheriger Versuch aus mit insertRow?
scoob99
User
Beiträge: 17
Registriert: Montag 10. Juni 2013, 17:15

Ach so, das ist natürlich bedeutend kürzer.

Hab das Problem behoben. Ich war so schusselig das Einfügen der Inhalte an die falsche Stelle zu setzen.

Ich danke dir vielmals für deine Tipps, das hat meinen Quelltext auf jeden Fall verbessert und verkürzt.
scoob99
User
Beiträge: 17
Registriert: Montag 10. Juni 2013, 17:15

Hab noch nen weiteres Problem mit meiner Tabelle, wollte dafür aber nicht extra nen neues Thema erstellen. Ich hoffe das ist ok.

Ich würde gerne die Ausgabe der Daten in der Tabelle alphabetisch sortieren. Hab auch schon so einiges probiert, aber nix will funktionieren.
Ich hoffe mir kann jemand helfen.
EmaNymton
User
Beiträge: 174
Registriert: Sonntag 30. Mai 2010, 14:07

Entweder lässt du dir per SQL-Befehl die Daten schon sortiert zurückgeben oder du benutzt die entsprechende Methode, die in der Doku steht:
http://qt-project.org/doc/qt-4.8/qtablewidget.html

Aber: "If you want to enable sorting in your table widget, do so after you have populated it with items, otherwise sorting may interfere with the insertion order (see setItem() for details)."
scoob99
User
Beiträge: 17
Registriert: Montag 10. Juni 2013, 17:15

Danke für die schnelle Antwort. Die Sortierung schon beim auslesen aus der Datenbank hatte ich völlig außer Acht gelassen.
AlphaX2
User
Beiträge: 53
Registriert: Dienstag 28. Juni 2011, 10:42

Je nach Komplexität, sollen Daten bearbeitet werden usw., könnte es allerdings sein, dass ein QTableView besser geeignet ist, als ein TableWidget. Dann hat man mit setData() und seinem Model auch die volle Kontrolle und kann vieles nach seinen Wünschen gestalten, man muss dann natürlich auch ein eigenes Model und alle nötigen Methoden implementieren.

AlphaX2
Antworten