如何在PyQt5中修改Table Widget的行与列背景色?
解决PyQt5 Table Widget行/列背景色修改问题
在PyQt5 Designer中设置的方法
用样式表精准控制
选中Table Widget后右键选择「改变样式表」,根据需求输入以下代码:- 奇数行背景色:
QTableWidget::item:odd { background-color: #f0f0f0; } - 偶数行背景色:
QTableWidget::item:even { background-color: #ffffff; } - 指定某一列(比如第2列,索引从0开始):
QTableWidget::item:column(1) { background-color: #e6f7ff; } - 选中行高亮:
QTableWidget::item:selected { background-color: #2385bb; color: white; }
注意:如果样式没生效,先去属性面板关闭alternatingRowColors(交替行颜色),这个属性会覆盖自定义样式。
- 奇数行背景色:
快速设置交替行颜色
在属性面板找到alternatingRowColors并勾选,然后设置alternateBase和base两个颜色属性,分别对应交替行和默认行的背景色,不用写样式表就能快速实现交替效果。
代码层面的实现方式
1. 样式表批量设置
from PyQt5.QtWidgets import QApplication, QTableWidget, QTableWidgetItem import sys app = QApplication(sys.argv) table = QTableWidget(5, 3) # 自定义行/列样式 table.setStyleSheet(""" QTableWidget::item:odd { background-color: #f5f5f5; } QTableWidget::item:even { background-color: #ffffff; } QTableWidget::item:column(0) { background-color: #ffebee; } /* 第一列单独变色 */ """) # 填充测试数据 for i in range(5): for j in range(3): table.setItem(i, j, QTableWidgetItem(f"Row {i} Col {j}")) table.show() sys.exit(app.exec_())
2. 自定义代理实现灵活控制
如果需要根据单元格内容动态变色,用自定义ItemDelegate更灵活:
from PyQt5.QtWidgets import QStyledItemDelegate, QApplication, QTableWidget from PyQt5.QtGui import QColor, QPalette from PyQt5.QtCore import Qt import sys class CustomCellDelegate(QStyledItemDelegate): def initStyleOption(self, option, index): super().initStyleOption(option, index) # 奇数行设浅蓝背景 if index.row() % 2 == 1: option.backgroundBrush = QColor("#f0f8ff") # 第二列设浅黄色背景 if index.column() == 1: option.backgroundBrush = QColor("#fffacd") # 选中行保留高亮样式 if option.state & option.State_Selected: option.backgroundBrush = QColor("#4a90e2") option.palette.setColor(QPalette.Text, Qt.white) app = QApplication(sys.argv) table = QTableWidget(5, 3) table.setItemDelegate(CustomCellDelegate()) # 填充测试数据 for i in range(5): for j in range(3): table.setItem(i, j, QTableWidgetItem(f"Cell {i}-{j}")) table.show() sys.exit(app.exec_())
常见坑点排查
- 样式表不生效:检查父控件是否有样式覆盖,或者是否开启了
alternatingRowColors属性,这个属性会优先于自定义样式。 - 列颜色设置错误:
column(n)里的n是从0开始的列索引,别把第一列写成1了。
内容的提问来源于stack exchange,提问作者Prazzy
相关产品推荐
相关产品推荐

