pyqt5 qtablewidget 编辑单元格时的单元格背景

pyqt5 qtablewidget cell background while editing cell

self.grid.setStyleSheet("QTableWidget::item::selected { background-color:#F9F6F5 ; color:black;  
border: 3px solid black; }")

目前我正在使用 styleSheet 作为我的 qtablewidget 背景,当我 select 一个项目它改变了那个单元格的背景 like this 这就是我想要的

但是当我开始编辑时它回到了默认设置 like this 我不知道我应该使用哪个关键字而不是 'item::selected' 或者它是否存在

您可以使用 descendant css selector,它可以用来为另一个 widget 的后代指定样式(它可以是直接子代, “孙子”等)。

如果项目有字符串值,项目视图的编辑通常使用 QLineEdit 完成,解决方案是使用 QTableWidget QLineEdit,并且由于样式将相同,您还可以连接选择器带逗号:

self.grid.setStyleSheet('''
    QTableWidget::item::selected, <b>QTableWidget QLineEdit</b> { 
        background-color: #F9F6F5; 
        color: black; 
        border: 3px solid black; 
    }
''')

请注意,您需要后代选择器,而不是 子选择器 (parent > child),它仅适用于 直接子 : 项目视图的编辑器不是视图的直接子视图,因为项目视图具有以下层次结构:

项目视图 -> 视口(可滚动的内容)-> 编辑器

如果您在 table 小部件上设置样式表,甚至不需要后代选择器,因为它会自动应用于应用 css 的小部件的所有子部件.

如果其他数据类型用于 Qt.DisplayRole(或者更准确地说,Qt.EditRole),您应该根据类型使用相关的小部件:例如,如果您将值设置为整数,将使用 QSpinBox,因此选择器将为 QTableWidget QSpinBox.

除了 strings 和 bool(使用 QComboBox)之外,所有其他标准编辑小部件都是 QAbstractSpinBox 的子class,因此您可以只使用父 class 代替(在以下示例中我假设 self.grid 是一个 QTableWidget):

    self.grid.setStyleSheet('''
        QTableWidget::item::selected, 
        QLineEdit, QComboBox, QAbstractSpinBox {
            ...
        }
''')

如果样式表设置在父级上(例如,主 window,甚至整个应用程序),您仍然需要后代选择器:

class MyMainWindow(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()
        # ...
        self.setStyleSheet('''
            QTableWidget::item::selected, 
            QTableWidget QLineEdit, 
            QTableWidget QComboBox, 
            QTableWidget QAbstractSpinBox {
                ...
            }
        ''')