Seite 1 von 1

QTableWidget

Verfasst: Donnerstag 3. September 2009, 17:46
von microkernel
Hallo,
weiß jemand wie ich aus einen QTableWidget den Inhalt aus einer bestimmten spalte/zeile auslesen kann?
Leider verstehe ich die PyQt Class Reference nicht (nicht wegen den englisch sondern wegen diesen blöden beispielen)
Vielleicht kann mir ja jemand 'n paar beispiel zeilen schreiben.

lg
microkernel

Verfasst: Donnerstag 3. September 2009, 19:36
von franzf
Naja, sooo schlecht ist die Doku auch nicht. Das Problem ist halt, dass die ganze Doku samt Beispielen von der C++-Doku übernommen wurden...

Zu deinem Problem: Du fütterst doch sicherlich deine QTableWidget in der Art:

Code: Alles auswählen

item = QTableWidgetItem()
item.setData( Qt.DisplayRole, "Tabellentext" )
table = QTableWidget(10,10)
table.setItem(0, 0, item)
Und genau so kommst du auch wieder an die Daten ran:

Code: Alles auswählen

item2 = table.item(0,0)
data = item2.data(Qt.DisplayRole)
Das einzige, was jetzt für nen Python-Programmierer ungewohnt sein sollte ist die Klasse QVariant. In C++ kann man nicht so ohne weiteres in einer Variablen beliebige Typen abspeichern. Eine Variable ist immer fix an einen Typen gebunden. Deshalb gibt es in Qt dafür QVariant. Du weißt was da für ein Typ drinnen steckt (in unserem Fall ein String).
Diesen kriegst du mit

Code: Alles auswählen

stringData = data.toString()
Schau dir auch mal die anderen DisplayRoles an. Z.B. BackgroundRole, um nen anderen Hintergrund-Brush zu setzen (gemustertes Tile z.B.), oder FontRole. Oder TooltipRole für ein Tooltip.

Verfasst: Freitag 4. September 2009, 13:22
von microkernel
wenn ich das in mein Script einfüge kommt aber folgende Fehlermeldung:

Code: Alles auswählen

Traceback (most recent call last):
  File "C:\Dokumente und Einstellungen\*********\Desktop\Datenbank Manager\Source\Add\Database Edit.pyw", line 166, in saveEdits
    data = coordinates.data(Qt.DisplayRole)          # Get title
AttributeError: 'module' object has no attribute 'DisplayRole'
Wo liegt das Problem?

Verfasst: Freitag 4. September 2009, 14:13
von franzf
Kommt halt drauf an wie du deine Module importierst :P

Code: Alles auswählen

>>> from PyQt4 import QtCore
>>> role = QtCore.Qt.DisplayRole
Ich hab halt im Beispiel oben aus reiner Faulheit das da gemacht:

Code: Alles auswählen

>>> from PyQt4.Qt import *
>>> role = Qt.DisplayRole

Verfasst: Freitag 4. September 2009, 14:52
von microkernel
ok.. so sieht das ganze jetzt aus:

Code: Alles auswählen

from PyQt4 import QtCore...
.....
coordinates = self.table.item(Count_X ,Count_Y)       # |
tableData = coordinates.data(QtCore.Qt.DisplayRole)  # Get title
title = tableData.toString()                          # |
....
Aber trotzdem kommt folgende Fehlermeldung:

Code: Alles auswählen

Traceback (most recent call last):
  File "C:\Dokumente und Einstellungen\*************\Desktop\Datenbank Manager\Source\Add\Database Edit.pyw", line 184, in saveEdits
    reSet_Index()
  File "C:\Dokumente und Einstellungen\*********\Desktop\Datenbank Manager\Source\Add\Database Edit.pyw", line 170, in reSet_Index
    tableData = coordinates.data(QtCore.Qt.DisplayRole)          # Get title
AttributeError: 'NoneType' object has no attribute 'data'
Ich seh einfach den fehler nicht....:(

Verfasst: Freitag 4. September 2009, 14:58
von cofi
Dann schau dir nochmal franzfs Code an:

Code: Alles auswählen

item = QTableWidgetItem()
item.setData( Qt.DisplayRole, "Tabellentext" )
table = QTableWidget(10,10)
table.setItem(0, 0, item)
``data`` verwendet er jedenfalls nicht.

Verfasst: Freitag 4. September 2009, 15:00
von microkernel
franzf hat geschrieben: Und genau so kommst du auch wieder an die Daten ran:

Code: Alles auswählen

item2 = table.item(0,0)
data = item2.data(Qt.DisplayRole)
Das einzige, was jetzt für nen Python-Programmierer ungewohnt sein sollte ist die Klasse QVariant. In C++ kann man nicht so ohne weiteres in einer Variablen beliebige Typen abspeichern. Eine Variable ist immer fix an einen Typen gebunden. Deshalb gibt es in Qt dafür QVariant. Du weißt was da für ein Typ drinnen steckt (in unserem Fall ein String).
Diesen kriegst du mit

Code: Alles auswählen

stringData = data.toString()
Schau dir auch mal die anderen DisplayRoles an. Z.B. BackgroundRole, um nen anderen Hintergrund-Brush zu setzen (gemustertes Tile z.B.), oder FontRole. Oder TooltipRole für ein Tooltip.
irgendwie schon.....

Verfasst: Freitag 4. September 2009, 15:16
von franzf
microkernel hat geschrieben:Aber trotzdem kommt folgende Fehlermeldung:

Code: Alles auswählen

Traceback (most recent call last):
  File "C:\Dokumente und Einstellungen\*************\Desktop\Datenbank Manager\Source\Add\Database Edit.pyw", line 184, in saveEdits
    reSet_Index()
  File "C:\Dokumente und Einstellungen\*********\Desktop\Datenbank Manager\Source\Add\Database Edit.pyw", line 170, in reSet_Index
    tableData = coordinates.data(QtCore.Qt.DisplayRole)          # Get title
AttributeError: 'NoneType' object has no attribute 'data'
Ich seh einfach den fehler nicht....:(
Dann schau dir die Fehlermeldung noch mal gaaaaaanz genau an! Das Problem steht da sehr wohl.

Kleiner Tip: Was heiß "NoneType" und wie kommt der hier zustande?

Verfasst: Freitag 4. September 2009, 15:29
von microkernel
sorry ich checks echt nicht... Kannst du mir nicht einfach das Problem sagen?

Verfasst: Freitag 4. September 2009, 15:41
von franzf
microkernel hat geschrieben:sorry ich checks echt nicht... Kannst du mir nicht einfach das Problem sagen?
Der Typ "NoneType" in Python ist wohl vergleichbar mit dem "NULL" in der C/C++-Welt. Es existiert an dieser Stelle kein item. Du musst erst ein QTableWidgetItem an dieser Stelle setzen bevor du drauf zugreifen kannst!

Verfasst: Freitag 4. September 2009, 17:29
von microkernel
aaaahhh... sorry. Hätte ich eigentlich wissen müssen.
Vielen Dank :D!