2016-03-24 13 views
1

Ich habe eine QTableWidget, wo ich einzelne horizontale Header-Elemente basierend auf einem Kriterium Farbe.Farbe einzelne horizontale Header von QTableWidget in PyQt

Was ich mit so weit gekommen sind:

stylesheet = "::section{Background-color:rgb(190,1,1)}" 
self.ui.Table.horizontalHeader().setStyleSheet(stylesheet) 

Dies funktioniert, aber es Farben alle Header gleichzeitig, ohne dass ich die Farbe eines einzelnen Kopf ändern zu können. So ist der nächste logische Schritt wäre:

self.ui.Table.horizontalHeaderItem(0).setStyleSheet(stylesheet) 

Das funktioniert nicht, als ein einziger Kopf Element nicht Einstellung unterstützt ein Stylesheet.

Endlich:

self.ui.Table.horizontalHeaderItem(0).setBackgroundColor(QtCore.Qt.red) 

Diese ganz gut läuft ohne Python Jammern, aber es scheint nicht, überhaupt keine Auswirkung auf die Hintergrundfarbe zu haben.

Ich sah schon this answer, es ist, was meinen ersten Versuch ausgelöst hat. Es handelt sich jedoch nur um das Färben aller Header mit der gleichen Farbe.

Wie kann ich die Header einzeln färben?

Antwort

1

Sie dies mit dem folgenden Rezept tun können:

import sys 
from PyQt5 import QtCore, QtGui, QtWidgets 

class MyFrame(QtWidgets.QFrame): 
    def __init__(self, parent=None,initials=None): 
     QtWidgets.QFrame.__init__(self, parent) 
     self.table = QtWidgets.QTableWidget(5,3,self) 
     self.table.move(30,30) 
     self.table.resize(400,300) 

     item1 = QtWidgets.QTableWidgetItem('red') 
     item1.setBackground(QtGui.QColor(255, 0, 0)) 
     self.table.setHorizontalHeaderItem(0,item1) 

     item2 = QtWidgets.QTableWidgetItem('green') 
     item2.setBackground(QtGui.QColor(0, 255, 0)) 
     self.table.setHorizontalHeaderItem(1,item2) 

     item3 = QtWidgets.QTableWidgetItem('blue') 
     item3.setBackground(QtGui.QColor(0, 0, 255)) 
     self.table.setHorizontalHeaderItem(2,item3) 

if __name__ == '__main__': 
    app = QtWidgets.QApplication(sys.argv) 
    app.setStyle(QtWidgets.QStyleFactory.create('Fusion')) # won't work on windows style. 
    Frame = MyFrame(None) 
    Frame.resize(500,400) 
    Frame.show() 
    app.exec_() 

, die in dieser Folge wird:

Different colors for header items in QTableWidget

Eine Sache, die Sie beachten müssen, ist, dass Windows-Stil nicht zulassen, nicht Du machst das. Dies ist der Grund, warum ich den Stil zu Fusion ändern musste.

+0

Leider bin ich gezwungen, PyQt4 zu verwenden. Nachdem ich alle Importe angepasst habe, bekomme ich einen Tisch mit ungefärbten Überschriften. Ich denke, diese Funktion scheint mit PyQt4 nicht zu funktionieren. Ich werde einige Zeit warten, wenn jemand eine Lösung für PyQt4 findet. Ansonsten werde ich Ihre als akzeptierte Antwort für alle PyQt5-Benutzer markieren, die damit zu kämpfen haben. – stebu92

+0

Sind Sie sicher? Exklusive Importe sollte alles (in diesem Beispiel) genauso funktionieren. Hast du den App-Stil geändert? "app.setStyle (QtWidgets.QStyleFactory.create ('Fusion'))" Versuchen Sie es mit anderen Stilen, da ich nicht weiß, ob sich die Berechtigungen zwischen den Qt-Versionen geändert haben. Für den "Windows" -Stil bin ich mir ziemlich sicher, dass es nicht funktionieren wird, unabhängig von der Qt-Version. – armatita

+0

Sie haben Recht, es funktioniert mit Plastique und Cleanlooks, nicht mit Fusion oder Windows jedoch – stebu92

Verwandte Themen