Seite 1 von 1
QTableWidget - Inhalt wird nicht angezeigt
Verfasst: Sonntag 20. Oktober 2013, 14:50
von scoob99
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.
Re: QTableWidget - Inhalt wird nicht angezeigt
Verfasst: Sonntag 20. Oktober 2013, 15:09
von EmaNymton
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.
Re: QTableWidget - Inhalt wird nicht angezeigt
Verfasst: Sonntag 20. Oktober 2013, 15:26
von scoob99
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?
Re: QTableWidget - Inhalt wird nicht angezeigt
Verfasst: Sonntag 20. Oktober 2013, 15:34
von EmaNymton
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.
Re: QTableWidget - Inhalt wird nicht angezeigt
Verfasst: Sonntag 20. Oktober 2013, 15:47
von scoob99
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?
Re: QTableWidget - Inhalt wird nicht angezeigt
Verfasst: Sonntag 20. Oktober 2013, 15:57
von EmaNymton
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?
Re: QTableWidget - Inhalt wird nicht angezeigt
Verfasst: Sonntag 20. Oktober 2013, 16:09
von scoob99
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.
Re: QTableWidget - Inhalt wird nicht angezeigt
Verfasst: Montag 21. Oktober 2013, 22:23
von scoob99
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.
Re: QTableWidget - Inhalt wird nicht angezeigt
Verfasst: Montag 21. Oktober 2013, 23:04
von EmaNymton
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)."
Re: QTableWidget - Inhalt wird nicht angezeigt
Verfasst: Dienstag 22. Oktober 2013, 07:37
von scoob99
Danke für die schnelle Antwort. Die Sortierung schon beim auslesen aus der Datenbank hatte ich völlig außer Acht gelassen.
Re: QTableWidget - Inhalt wird nicht angezeigt
Verfasst: Dienstag 29. Oktober 2013, 20:54
von AlphaX2
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