Seite 1 von 1

QTablewidget Zellen gradient

Verfasst: Montag 12. Oktober 2015, 11:07
von Jepedaja
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

Re: QTablewidget Zellen gradient

Verfasst: Dienstag 13. Oktober 2015, 09:42
von 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.

Re: QTablewidget Zellen gradient

Verfasst: Dienstag 13. Oktober 2015, 10:47
von 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()

Re: QTablewidget Zellen gradient

Verfasst: Donnerstag 15. Oktober 2015, 20:08
von Jepedaja
@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?