如何在 QTableView 中将 QColor 作为 QBackgroundRole 返回,它在 PyQt5 中具有预设样式表?

Posted

技术标签:

【中文标题】如何在 QTableView 中将 QColor 作为 QBackgroundRole 返回,它在 PyQt5 中具有预设样式表?【英文标题】:How to return a QColor as the QBackgroundRole in QTableView which has preset stylesheet in PyQt5? 【发布时间】:2021-06-28 11:51:34 【问题描述】:

我遇到了一个奇怪的问题,如标题所述。

我有一个 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) 中返回一个 QColor,但它不起作用。如果我删除了样式表,那么它就起作用了。有谁是我的 QSS 的哪一行造成了问题?

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

我需要样式表,同时我还需要 Qt.BackgroundRole 才能工作。

【问题讨论】:

【参考方案1】:

看起来像partially known 和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)

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

【讨论】:

以上是关于如何在 QTableView 中将 QColor 作为 QBackgroundRole 返回,它在 PyQt5 中具有预设样式表?的主要内容,如果未能解决你的问题,请参考以下文章

如何在QTableView Qt C ++中将sqlite db数据显示为多列视图?

如何使用 QSqlTableModel 在可编辑的 QTableView 中将值设置为 NULL

请问在QT4中我用QTableView 和QSqlTableModel操作数据库,我想改变tableview某行的背景色应该怎么做?

如何在 Qt 中为 SRGB 颜色空间创建 QColor 对象?

如何在小部件中显示来自 QColorDialog 的 QColor?

NameError:未定义全局名称“QColor”