tableWidget.Item Background Color

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
marju
User
Beiträge: 21
Registriert: Donnerstag 12. Dezember 2019, 13:26
Wohnort: Bad Pyrmont

Moin zusammen,
ich stehe etwas auf dem Schlauch beim colorieren meiner Tabelle.
Die Daten der Tabelle werden aus einer Datenbankabfrage generiert.

Codezeile:
import PyQt5.QtWidgets as widgets
import PyQt5.uic as uic
from PyQt5.QtWidgets import QTableWidgetItem, QInputDialog, QMessageBox
from PyQt5 import QtCore, QtGui

uic.loadUi("main.ui")
m.tableWidget_uebersicht.setItem(t,5, QTableWidgetItem(datenwert))

Zum einfärben, später, wenn der Wert z.B. unter Null:
m.tableWidget_uebersicht.Item(t,5).setStyleSheet("background-color: rgb(255, 100, 100)")

Leider komme ich da nicht weiter. Habe unterschiedlichste schreibweisen ausprobiert.
Das Programm stürzt einfach ohne Meldung ab. Eventuell hat ja einer eine Idee dazu.

Vielen Dank
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@marju: Was heisst ohne Meldung? Was steht denn in der Konsole, wenn Du es von einer Konsole aus startest? Wenn ich mir mit den gegebenen Informationen ein lauffähiges Minimalbeispiel bastele, dann sehe ich da eine sehr aussagekräftige Ausnahme samt Traceback.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
marju
User
Beiträge: 21
Registriert: Donnerstag 12. Dezember 2019, 13:26
Wohnort: Bad Pyrmont

Hallo blackjack,
leider gibt die Konsole nichts aus. Weder in Eclipse noch in der Python IDE. Das Programm stürzt einfach ab.
Habe ein Miniprogramm zum Testen erstellt. (Danke für den Tip).

Code:
import sys
import PyQt5.QtWidgets as widgets
import PyQt5.uic as uic
from PyQt5.QtWidgets import QTableWidgetItem, QInputDialog, QMessageBox
from PyQt5 import QtCore, QtGui, Qt

app = widgets.QApplication(sys.argv)
m = uic.loadUi("main-SMD-1.ui")

m.tableWidget_uebersicht.setColumnCount(3)
m.tableWidget_uebersicht.setColumnWidth(0,200)
m.tableWidget_uebersicht.setColumnWidth(1,200)
m.tableWidget_uebersicht.setColumnWidth(2,200)
m.tableWidget_uebersicht.setStyleSheet("background-color: rgb(255, 0, 0);")
m.tableWidget_uebersicht.setHorizontalHeaderLabels(['Spalte1', 'Spalte2', 'Spalte3'])

m.tableWidget_uebersicht.setRowCount(10)
m.tableWidget_uebersicht.setItem(2,1, QTableWidgetItem('Was auch immer'))
m.tableWidget_uebersicht.setItem(3,1, QTableWidgetItem('Was auch immer'))
m.tableWidget_uebersicht.setItem(4,1, QTableWidgetItem('Was auch immer'))

#Zeile die ich nicht zum Laufen bekomme
m.tableWidget_uebersicht.setItem(3,2, QTableWidgetItem.setBackground(100,100,100))
#

color = m.tableWidget_uebersicht.item(3,1).background()
print (color)
m.show()
sys.exit(app.exec_())
app.exec()

Jetzt habe ich in der Console eine Fehlermeldung:

Traceback (most recent call last):
File "C:\eclipse-workspace\Tabellenhintergrund\Tabellenhintergrund.py", line 27, in <module>
m.tableWidget_uebersicht.setItem(3,2, QTableWidgetItem.setBackground(100,100,100))
TypeError: setBackground(self, Union[QBrush, QColor, Qt.GlobalColor, QGradient]): first argument of unbound method must have type 'QTableWidgetItem'

Ich habe alles mögliche getestet. Irgendwie sehe ich den Wald vor lauter Bäumen nicht mehr.
marju
User
Beiträge: 21
Registriert: Donnerstag 12. Dezember 2019, 13:26
Wohnort: Bad Pyrmont

Hallo,
ich habs jetzt hinbekommen.
Die Zeile muss sein:
m.tableWidget_uebersicht.item(3,1).setBackground(QtGui.QColor(100,150,100))

Danke ist gelöst :D
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@marju: Da machst Du jetzt aber einen anderen Fehler als im Programm davor. Der hat auch nichts mit Qt zu tun, sondern mit Klassen und objektorientierter Programmierung (OOP) allgemein: Du rufst eine Methode auf der Klasse auf, die auf einem Objekt von diesem Typ aufgerufen werden muss. Um die Hintergrundfarbe zu ändern braucht man ein konkretes `QTableWidgetItem` bei dem man das machen möchte, das kann man nicht auf dem Datentyp selbst aufrufen.

Minimal lauffähig ist das auch nur für Dich, denn wir kennen die *.ui-Datei ja nicht. Das Originalproblem war das hier:

Code: Alles auswählen

#!/usr/bin/env python3
import sys

from PyQt5.QtWidgets import QApplication, QTableWidget, QTableWidgetItem


def main():
    app = QApplication(sys.argv)
    table_widget = QTableWidget(5, 5)
    table_widget.setItem(0, 1, QTableWidgetItem("42"))
    table_widget.Item(0, 1).setStyleSheet(
        "background-color: rgb(255, 100, 100)"
    )
    table_widget.show()
    sys.exit(app.exec())


if __name__ == "__main__":
    main()
Und das gibt bei mir eine Ausnahme, die das Problem deutlich macht:

Code: Alles auswählen

Traceback (most recent call last):
  File "./forum21.py", line 19, in <module>
    main()
  File "./forum21.py", line 11, in main
    table_widget.Item(0, 1).setStyleSheet(
AttributeError: 'QTableWidget' object has no attribute 'Item'
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
marju
User
Beiträge: 21
Registriert: Donnerstag 12. Dezember 2019, 13:26
Wohnort: Bad Pyrmont

Hallo blackjack,
hast recht. Erst das Item erzeugen, dann kann ich es "modifizieren".
Mit der Oop habe ich noch nicht all zu viel Erfahrung. Eigentlich gar keine. Ich übe noch.
Vielen Dank für die Unterstützung.

Marc
Antworten