繁体   English   中英

PyQt5:如果选择了行,则更改一个单元格中的字体颜色(QAbstractTableModel)

[英]PyQt5 : Change font color in one cell if row is selected (QAbstractTableModel)

我有一个带有模型的QTableView ,如果我选择一行,我想更改特定列中的前景色。 我用QStyledItemDelegate尝试了一些东西,但没有任何效果。 有人可以帮助我吗?

tableViewSelectionBehaviorSelectRows

使用 Tableview 上的 StyleSheets,我将颜色设置为'color:rgb(255,255,255)'并将选择颜色设置为'color:rgb(255, 181, 62)' 但是如果我选择一行,第 8 列的颜色应该保持为'color:rgb(255,255,255)'

非常感谢您

编辑:

from PyQt5 import QtWidgets
from PyQt5 import QtGui

class reportDelegate(QtWidgets.QStyledItemDelegate):
    def initStyleOption(self, option, index):
        super(reportDelegate, self).initStyleOption(option, index)

        color = QtGui.QColor(255,255,255)

        if index.column() == 8:
            color = QtGui.QColor(255,255,255)
            if option.state & QtWidgets.QStyle.State_Selected:
                option.palette.setColor(QtGui.QPalette.Normal, QtGui.QPalette.HighlightedText, QtGui.QColor(255,255,255))
        else:
            if option.state & QtWidgets.QStyle.State_Selected:
                option.palette.setColor(QtGui.QPalette.Normal, QtGui.QPalette.HighlightedText, QtGui.QColor(255, 181, 62))
        option.palette.setBrush(QtGui.QPalette.Text, color)

现在我知道了。 有用。 但我还有另一个问题。 当我双击一行时,会打开一个 QDialog。 如果 QDialog 打开,则所选行的颜色切换为黑色,但应保持白色。 我不知道所选行的状态,但是不活动或其他行,所以我不知道在这种状态下如何使行变白。

编辑:现在它工作正常。 我在尝试某些东西的同时停用了颜色。 现在我再次激活它,该行保持白色。

如果有人对上述所有事情有更好的解决方案,我将不胜感激。

用于选定项目的前景(“文本”)颜色是使用HighlightedText ColorRole设置的。

当您还指定ColorGroup时,颜色集将仅对该选定组有效,如果未设置继承的角色,则恢复为父(或系统)调色板。

如果视图变为非活动状态(又名:未聚焦),并且您明确设置了另一个颜色组的颜色(在您的情况下为Normal ),Qt 将为任何其他角色和/或组使用默认颜色。

您需要为角色和所有颜色组设置调色板颜色,因此完全省略颜色组:

class reportDelegate(QtWidgets.QStyledItemDelegate):
    def initStyleOption(self, option, index):
        super().initStyleOption(option, index)

        if index.column() == 8:
            highlightColor = QtGui.QColor(255, 255, 255)
        else:
            highlightColor = QtGui.QColor(255, 181, 62)

        option.palette.setColor(QtGui.QPalette.HighlightedText,
            highlightColor)

笔记:

  • QPalette 始终将颜色存储为QBrush对象,即使使用QColorQt.GlobalColor参数(无论如何它在内部创建 QBrush 对象);
  • setStyleSheet()::item选择器一起使用,并且background属性将始终覆盖背景,无论是否设置了Qt.BackgroundRole (请参阅此相关答案
  • QStyle.State_Selected通常与这种检查无关,因为样式总是会验证状态; 忽略状态,无论如何设置调色板颜色,让默认实现完成剩下的工作; 这很重要,因为paint()负责最终选择要使用的实际颜色;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM