PyQt5组件QTableWidget选中Item不改变文字前景色的解决方案

项目场景

PyQt5组件QTableWidget选中Item不改变文字前景色的解决方案


问题描述

在使用python做一个爬虫可视化项目中,需要将数据进行表格化展示,采用PyQt5实现的GUI。
在使用组件QTableWidget展示表格时,选中Item或行时,出现文字颜色不能保持,而是会自动转为默认白色,而需要要求选中时要保持原有文字颜色。
PyQt5组件QTableWidget选中Item不改变文字前景色的解决方案_第1张图片
PyQt5组件QTableWidget选中Item不改变文字前景色的解决方案_第2张图片


解决方案

继承QItemDelegate类,重写paint函数。


python实例

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


最终效果

PyQt5组件QTableWidget选中Item不改变文字前景色的解决方案_第3张图片PyQt5组件QTableWidget选中Item不改变文字前景色的解决方案_第4张图片


参考链接

参考链接 https://stackoverflow.com/questions/286565/in-a-qtablewidget-changing-the-text-color-of-the-selected-row

你可能感兴趣的:(Python,python,爬虫,qt5)