PyQt5 更改QAbstractTableModel中的BackgroundRole设置。

问题描述 投票:0回答:1

我在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')

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

enter image description here

QT是否可以这样做? 如果可以,我需要改变什么设置?我相信 QBrush 允许我设置填充图案(即像上图一样的渐变),但是是否有类可以处理 大小 背景色 "项目 "相对于单元格的大小,以及它在单元格中的位置?

更新。

我现在有了下面的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)

这提供了以下格式。

enter image description here

有没有办法在每个单元格的顶部和底部提供5%的填充,这样渐变格式就只占到单元格垂直空间的90%,而不是目前的100%?即像这样(见顶部3行)。

enter image description here

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

python qt pyqt pyqt5
1个回答
2
投票

这种行为可以通过使用 QBrush 附带 QGradient我给大家举一个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;
}

结果: 你会有这样的东西。result

© www.soinside.com 2019 - 2024. All rights reserved.