繁体   English   中英

PyQt5 更改 QAbstractTableModel 中的 BackgroundRole 设置

[英]PyQt5 Change BackgroundRole Settings in QAbstractTableModel

我在 PyQT5 中使用 QTableView 来显示数据表。

我可以根据条件设置每个单元格的背景颜色。 例如将单元格变为红色:

class TableModel(QtCore.QAbstractTableModel):

    def __init__(self, data):
        super(TableModel, self).__init__()
        self._data = data

    def data(self, index, role):

        if role == Qt.BackgroundRole:
            if condition == ...
                return QtGui.QColor('#9C0006')

但是,我不想将背景颜色应用于整个单元格,而是仅将颜色应用于单元格的一部分(基于单元格的值)。 例如像这样:

在此处输入图像描述

QT 是否可以做到这一点,如果可以,我需要更改哪些设置? 我相信QBrush允许我设置填充模式(即上图的渐变),但是是否有 class 处理相对于单元格大小的背景颜色“项目”的大小,以及它在单元格内的位置?

更新:

我现在在 Python 中有以下代码,它将渐变的长度设置为单元格宽度的 50%(我稍后可以动态设置)。

if role == Qt.BackgroundRole:
    percent = 0.5

    gradient = QtGui.QLinearGradient(QtCore.QPointF(0, 0), QtCore.QPointF(1, 0))
    gradient.setColorAt(0, Qt.red)
    gradient.setColorAt(percent, Qt.white)
    gradient.setColorAt(1, Qt.white)
    gradient.setCoordinateMode(QtGui.QLinearGradient.ObjectMode)


    return QtGui.QBrush(gradient)

这提供了以下格式:

在此处输入图像描述

有没有办法为每个单元格的顶部和底部提供 5% 的填充,以便渐变格式仅填充单元格垂直空间的 90%,而不是当前的 100%? 即像这样的东西(见前3行)。

在此处输入图像描述

我想我需要设置 QBrush 坐标,以便 QBrush 操作只发生在部分单元格上? 但是,我似乎在 QBrush 文档中找不到与坐标相关的任何内容。 这可能吗?

这种行为可以通过使用带有QBrushQGradient来实现,我举一个 Qt C++ 的例子,只需适应 python:

QBrush::QBrush(const QGradient &gradient)
QLinearGradient

QVariant data(const QModelIndex &index, int role) const override {
    QVariant ret;
    if (index.isValid()){
        if (role == Qt::BackgroundRole){
            bool convert = false;
            double percent = index.data().toDouble(&convert);
            if (convert){
                QColor c = (percent < 25 ? Qt::red
                             : (percent < 50 ? Qt::yellow
                                 : (percent < 75 ? Qt::green : Qt::cyan)));
                QLinearGradient grad(QPointF(0, 0), QPointF(1, 0));
                grad.setCoordinateMode(QGradient::CoordinateMode::ObjectBoundingMode);
                grad.setColorAt(0, c);
                grad.setColorAt(percent/100.0, Qt::white);
                grad.setColorAt(1, Qt::white);

                ret = QBrush(grad);
            }
        } else {
            ret = QAbstractTableModel::data(index, role);
        }
    }
    return ret;
}

结果:你会得到这样的东西:
结果

暂无
暂无

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

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