QTablewidget Zellen gradient

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
Jepedaja
User
Beiträge: 17
Registriert: Dienstag 10. Februar 2015, 17:03

Hey liebe Pythonfreunde,

ich versuche aktuell in einem QTablewidget bei bestimmten Zellen den Hintergrund zu färben. Jedoch soll die Farbe ein linearer Gradient zwischen zwei Farben sein.
Mein Ansatz war:

Code: Alles auswählen

pa=QtGui.QPalette()
gradient=QtGui.QLinearGradient(0,0,0,1)
gradient.setColorAt(0.0,QtGui.QColor(100,63,18))
gradient.setColorAt(1.0,QtGui.QColor(79,2,10))
pa.setBrush(QtGui.QPalette.Window, QtGui.QBrush(gradient))
Und dann mit:

Code: Alles auswählen

tablewidget.setBackgroundColor(pa)
Jedoch funktioniert das ganze nicht so, wie ich gerne hätte.
Vielleicht sieht jemand auf die schnelle meinen Fehler.

MfG Jepedaja
BlackJack

@Jepedaja: Zuerst gibt's bei QPalette in der Dokumentation diesen Hinweis:
Warning: Some styles do not use the palette for all drawing, for instance, if they make use of native theme engines. This is the case for both the Windows XP, Windows Vista, and the Mac OS X styles.
Und dann setzt Du das für `QtGui.QPalette.Window`, was der Fensterhintergrund ist, also nichts mit einzelnen Zelle zu tun hat.

Für einzelne Zelle müsste `data()` beim Item-Modell für die `Qt::BackgroundRole` das passende `QBrush`-Exemplar liefern damit die Zelle farbig beziehungsweise mit einem Farbverlauf angezeigt wird.
BlackJack

Ich hab's leider auf Anhieb nicht geschafft das der Farbverlauf von 0 bis 1 in jeder Zelle ohne das man die grösser ziehen muss angezeigt wird:

Code: Alles auswählen

import sys
from PyQt4.QtGui import (
    QApplication, QBrush, QColor, QGradient, QLinearGradient, QMainWindow,
    QStandardItem, QStandardItemModel, QTableView,
)


def main():
    application = QApplication(sys.argv)
    window = QMainWindow()
    table = QTableView()

    gradient = QLinearGradient(0, 0, 0, 1)
    gradient.setColorAt(0, QColor(255, 255, 18))
    gradient.setColorAt(1, QColor(79, 2, 10))
    gradient.setCoordinateMode(QGradient.StretchToDeviceMode)
    brush = QBrush(gradient)

    size = 3
    model = QStandardItemModel(size, size)
    for row_number in xrange(size):
        for column_number in xrange(size):
            value = row_number * size + column_number + 1
            item = QStandardItem(str(value))
            if value % 2:
                item.setBackground(brush)
            model.setItem(row_number, column_number, item)
    
    table.setModel(model)
    window.setCentralWidget(table)
    window.show()
    sys.exit(application.exec_())


if __name__ == '__main__':
    main()
Die Stopp-Punkte des Farbverlaufs scheinen sich auf die gesamte Tabelle zu beziehen. Eventuell muss man sich ein Delegate schreiben und den Hintergrund tatsächlich selber ”malen”, oder wenn man die Anzahl der Tabellenzeilen kennt, kann man den Endpunkt nicht bei 1, sondern bei (1/anzahl der Zeilen) setzen.

Edit: Die letzte Idee mal umgesetzt:

Code: Alles auswählen

import sys
from PyQt4.QtGui import (
    QApplication, QBrush, QColor, QGradient, QHeaderView, QLinearGradient,
    QMainWindow, QStandardItem, QStandardItemModel, QTableView,
)


def main():
    application = QApplication(sys.argv)
    window = QMainWindow()
    table = QTableView()
    table.verticalHeader().setStretchLastSection(True)
    table.verticalHeader().setResizeMode(QHeaderView.Stretch)

    size = 3

    gradient = QLinearGradient(0, 0, 0, 1)
    gradient.setColorAt(0, QColor(255, 255, 18))
    gradient.setColorAt(1.0 / size, QColor(79, 2, 10))
    gradient.setCoordinateMode(QGradient.StretchToDeviceMode)
    brush = QBrush(gradient)

    model = QStandardItemModel(size, size)
    for row_number in xrange(size):
        for column_number in xrange(size):
            value = row_number * size + column_number + 1
            item = QStandardItem(str(value))
            if value % 2:
                item.setBackground(brush)
            model.setItem(row_number, column_number, item)
    
    table.setModel(model)
    window.setCentralWidget(table)
    window.show()
    sys.exit(application.exec_())


if __name__ == '__main__':
    main()
Jepedaja
User
Beiträge: 17
Registriert: Dienstag 10. Februar 2015, 17:03

@BlackJack

Danke vielmals, das war etwa das, was ich wollte. Da ich immer weiß, welche Position der Tabelle gefärbt werden soll, funktioniert das auch.
Das einzige, irgendwie sind die Farben dunkler/kontrastärmer, als sie sein sollten. Eine Idee, woher das kommt?
Antworten