PyQt5组件QTableWidget选中Item不改变文字前景色的解决方案
在使用python做一个爬虫可视化项目中,需要将数据进行表格化展示,采用PyQt5实现的GUI。
在使用组件QTableWidget展示表格时,选中Item或行时,出现文字颜色不能保持,而是会自动转为默认白色,而需要要求选中时要保持原有文字颜色。
继承QItemDelegate类,重写paint函数。
# -*-coding:utf-8 -*-
import sys
import qdarkstyle
from PyQt5.QtWidgets import *
from PyQt5.QtGui import QColor, QBrush, QPainter, QPalette, QFont
from PyQt5.QtCore import QModelIndex, Qt
from PyQt5 import QtWidgets
class ItemDelegate(QItemDelegate):
def __init__(self):
super(ItemDelegate, self).__init__()
def paint(self, p_painter: QPainter, r_option: QStyleOptionViewItem, r_index: QModelIndex):
""" paint(self, QPainter, QStyleOptionViewItem, QModelIndex) """
view_option = QStyleOptionViewItem(r_option)
color = r_index.data(Qt.ForegroundRole)
if color and color.isValid():
if color != r_option.palette.color(QPalette.WindowText):
view_option.palette.setColor(QPalette.HighlightedText, color)
QItemDelegate.paint(self, p_painter, view_option, r_index)
class TableWidgetTest(QWidget):
def __init__(self):
super(TableWidgetTest, self).__init__()
self.setWindowTitle("设置单元格字体和颜色")
self.resize(430, 230)
title_names = ['姓名', '性别', '体重(kg)']
row_count = 4
self.tableWidget = QTableWidget()
# 设置ItemDelegate
self.tableWidget.setItemDelegate(ItemDelegate())
self.tableWidget.setRowCount(row_count)
self.tableWidget.setColumnCount(len(title_names))
# 设置上方表头名称
self.tableWidget.setHorizontalHeaderLabels(title_names)
# 左侧表头不可见
self.tableWidget.verticalHeader().setVisible(False)
# 表头文本加粗
font = self.tableWidget.horizontalHeader().font()
font.setBold(True)
# 按行选中
self.tableWidget.setSelectionBehavior(QAbstractItemView.SelectRows)
# 单元格不可编辑
self.tableWidget.setEditTriggers(QAbstractItemView.NoEditTriggers)
# 行高自动分配
self.tableWidget.verticalHeader().setSectionResizeMode(QHeaderView.ResizeToContents)
# 设置某一行的行高分配模式
# self.tableWidget.verticalHeader().setSectionResizeMode(2, QHeaderView.ResizeToContents)
# 列宽自动分配
self.tableWidget.horizontalHeader().setSectionResizeMode(QHeaderView.ResizeToContents)
# self.tableView.horizontalHeader().setSectionResizeMode(2, QHeaderView.Fixed)
# 填充数据
for row in range(row_count):
for col in range(len(title_names)):
item = QTableWidgetItem(f"rows:{row} columns:{col}")
# 填充单元格数据
self.tableWidget.setItem(row, col, item)
if row == 1:
# 设置字体的前景色
# item.setForeground(QBrush(QColor(255, 0, 0)))
# 设置字体的前景色
self.tableWidget.item(row, col).setData(Qt.TextColorRole, QColor(Qt.red))
layout = QHBoxLayout()
layout.addWidget(self.tableWidget)
self.setLayout(layout)
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
app.setStyleSheet(qdarkstyle.load_stylesheet_pyqt5())
win = TableWidgetTest()
win.show()
sys.exit(app.exec_())
参考链接 https://stackoverflow.com/questions/286565/in-a-qtablewidget-changing-the-text-color-of-the-selected-row