在PyQt中为QTableWidget的各个水平标题着色

时间:2016-03-24 09:36:45

标签: python pyqt pyqt4

我有一个QTableWidget,我想根据某些标准为各个水平标题项着色。

到目前为止我想出了什么:

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

这是有效的,但它同时为所有标题着色,而我无法更改单个标题的颜色。所以下一个合乎逻辑的步骤是:

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

这不起作用,因为单个标题项不支持设置样式表。

最后:

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

在没有python抱怨的情况下运行良好,但它似乎对背景颜色没有任何影响。

我已经看过this answer,这是我第一次尝试的原因。但是它只处理着色相同颜色的所有标题。

如何单独为标题着色?

2 个答案:

答案 0 :(得分:1)

您可以使用以下方法执行此操作:

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_()

,这将导致:

Different colors for header items in QTableWidget

您必须考虑的一件事是Windows风格不允许您这样做。这就是我必须将风格改为Fusion的原因。

答案 1 :(得分:0)

setBackground似乎没有任何作用

查看此: https://forum.qt.io/topic/74609/cannot-set-the-backgroud-color-of-the-horizontalheaderitem-of-qtablewidget/2

我写了这个小应用程序;字体类型和大小以及前景色生效。

from PyQt4 import QtGui
from PyQt4.QtGui import QFont

app = QtGui.QApplication([])

columns = ['Column 0', 'Column 1', 'Column 2']
items = [['Row%s Col%s' % (row, col) for col in range(len(columns))] for row in range(1)]

view = QtGui.QTableWidget()

view.setColumnCount(len(columns))
view.setHorizontalHeaderLabels(columns)
view.setRowCount(len(items))
for row, item in enumerate(items):
    for col, column_name in enumerate(item):
        item = QtGui.QTableWidgetItem("%s" % column_name)
        view.setItem(row, col, item)
    view.setRowHeight(row, 16)

fnt = QFont()
fnt.setPointSize(15)
fnt.setBold(True)
fnt.setFamily("Arial")

item1 = view.horizontalHeaderItem(0)
item1.setForeground(QtGui.QColor(255, 0, 0))
item1.setBackground(QtGui.QColor(0, 0, 0))  # Black background! does not work!!
item1.setFont(fnt)

item2 = view.horizontalHeaderItem(1)
item2.setForeground(QtGui.QColor(0, 255, 0))
item2.setFont(fnt)

item3 = view.horizontalHeaderItem(2)
item3.setForeground(QtGui.QColor(255, 0, 255))

view.setHorizontalHeaderItem(0, item1)
view.setHorizontalHeaderItem(1, item2)
view.setHorizontalHeaderItem(2, item3)
view.show()
app.exec_()

enter image description here