PyQt中QTableWidget的颜色个别水平headers
Color individual horizontal headers of QTableWidget in PyQt
我有一个 QTableWidget,我想根据某些标准为单个水平 header 项目着色。
到目前为止我想出了什么:
stylesheet = "::section{Background-color:rgb(190,1,1)}"
self.ui.Table.horizontalHeader().setStyleSheet(stylesheet)
这行得通,但是它会同时为所有 header 着色,而我无法更改单个 header 的颜色。所以下一个合乎逻辑的步骤是:
self.ui.Table.horizontalHeaderItem(0).setStyleSheet(stylesheet)
这不起作用,因为单个 header 项目不支持设置样式表。
最后:
self.ui.Table.horizontalHeaderItem(0).setBackgroundColor(QtCore.Qt.red)
没有 python 抱怨,这运行得很好,但是它似乎对背景颜色没有任何影响。
我已经看过 this answer,正是它激发了我的第一次尝试。然而,它只处理用相同颜色为所有 header 着色。
如何单独为 header 着色?
您可以使用以下方法做到这一点:
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_()
,这将导致:
你必须考虑的一件事是 Windows 风格不允许你这样做。这就是我不得不将样式更改为 Fusion 的原因。
setBackground seems to have no effect When used in header
我写了这个小应用;字体类型和大小以及前景色生效。
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_()
我有一个 QTableWidget,我想根据某些标准为单个水平 header 项目着色。
到目前为止我想出了什么:
stylesheet = "::section{Background-color:rgb(190,1,1)}"
self.ui.Table.horizontalHeader().setStyleSheet(stylesheet)
这行得通,但是它会同时为所有 header 着色,而我无法更改单个 header 的颜色。所以下一个合乎逻辑的步骤是:
self.ui.Table.horizontalHeaderItem(0).setStyleSheet(stylesheet)
这不起作用,因为单个 header 项目不支持设置样式表。
最后:
self.ui.Table.horizontalHeaderItem(0).setBackgroundColor(QtCore.Qt.red)
没有 python 抱怨,这运行得很好,但是它似乎对背景颜色没有任何影响。
我已经看过 this answer,正是它激发了我的第一次尝试。然而,它只处理用相同颜色为所有 header 着色。
如何单独为 header 着色?
您可以使用以下方法做到这一点:
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_()
,这将导致:
你必须考虑的一件事是 Windows 风格不允许你这样做。这就是我不得不将样式更改为 Fusion 的原因。
setBackground seems to have no effect When used in header
我写了这个小应用;字体类型和大小以及前景色生效。
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_()