QTableWidget

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
Benutzeravatar
microkernel
User
Beiträge: 271
Registriert: Mittwoch 10. Juni 2009, 17:27
Wohnort: Frankfurt
Kontaktdaten:

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
franzf
User
Beiträge: 78
Registriert: Samstag 29. August 2009, 10:21

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.
Benutzeravatar
microkernel
User
Beiträge: 271
Registriert: Mittwoch 10. Juni 2009, 17:27
Wohnort: Frankfurt
Kontaktdaten:

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?
franzf
User
Beiträge: 78
Registriert: Samstag 29. August 2009, 10:21

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
Benutzeravatar
microkernel
User
Beiträge: 271
Registriert: Mittwoch 10. Juni 2009, 17:27
Wohnort: Frankfurt
Kontaktdaten:

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....:(
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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.
Benutzeravatar
microkernel
User
Beiträge: 271
Registriert: Mittwoch 10. Juni 2009, 17:27
Wohnort: Frankfurt
Kontaktdaten:

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.....
franzf
User
Beiträge: 78
Registriert: Samstag 29. August 2009, 10:21

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?
Benutzeravatar
microkernel
User
Beiträge: 271
Registriert: Mittwoch 10. Juni 2009, 17:27
Wohnort: Frankfurt
Kontaktdaten:

sorry ich checks echt nicht... Kannst du mir nicht einfach das Problem sagen?
franzf
User
Beiträge: 78
Registriert: Samstag 29. August 2009, 10:21

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!
Benutzeravatar
microkernel
User
Beiträge: 271
Registriert: Mittwoch 10. Juni 2009, 17:27
Wohnort: Frankfurt
Kontaktdaten:

aaaahhh... sorry. Hätte ich eigentlich wissen müssen.
Vielen Dank :D!
Antworten