如何在PyQt5预设样式表的QTableView中return一个QColor作为QBackgroundRole?

How to return a QColor as the QBackgroundRole in QTableView which has preset stylesheet in PyQt5?

我遇到了如题所述的奇怪问题

我有一个 QTableView。

self.table = QTableView()

然后给它设置一些QSS。

self.table.setStyleSheet('''
QTableView {
    border: 2px solid red;
    padding: 5px;
    border-radius: 5px;
    gridline-color: red;
    color: red;
}
QTableView::item{
    border-color: none;
    padding-left: 5px;
    padding-right: 5px;
    gridline-color: rgb(44, 49, 60);
    border-bottom: 1px solid green;
}
QTableView::item:selected{
    background-color: blue;
}
''')

然后我尝试在模型 (QAbstractTableModel) 中 return 一个 QColor,它只是行不通。如果我删除样式 sheet,那么它就起作用了。有没有人是我的 QSS 的哪一行造成了问题?

if role == Qt.BackgroundRole and index.row() == self.headStart:
            # Set header start color
            return QColor(208, 74, 2)

我需要风格sheet,同时我也需要Qt.BackgroundRole工作

看起来像 partially known and unresolved bug,当为 ::item 选择器指定背景颜色或边框时,颜色角色将被忽略(因为它已被样式表覆盖)。

一个可能的解决方案是在调用默认实现之前设置一个项目委托并填充底层矩形

class BackgroundDelegate(QtWidgets.QStyledItemDelegate):
    def paint(self, qp, opt, index):
        if index.data(QtCore.Qt.BackgroundRole):
            qp.fillRect(opt.rect, index.data(QtCore.Qt.BackgroundRole))
        super().paint(qp, opt, index)

class SomeClass(QtWidgets.QWidget):
    def __init__(self):
        # ...
        self.table = QtWidgets.QTableView()
        self.delegate = BackgroundDelegate(self.table)
        self.table.setItemDelegate(self.delegate)

如果由于某些 OS 样式问题而无法正常工作,请尝试也为基本项目选择器设置 background: transparent