PyQt5 Изменить настройки фона в QAbstractTableModel - PullRequest
1 голос
/ 07 мая 2020

Я использую QTableView в PyQT5 для отображения таблицы данных.

Я могу установить цвет фона каждой ячейки в зависимости от условия. Например, чтобы сделать ячейку красной:

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

Я полагаю, мне нужно установить координаты QBru sh, чтобы QBru sh работа происходит только на части ячейки? Однако я не могу найти в документации QBru sh ничего, связанного с координатами. Возможно ли это?

1 Ответ

2 голосов
/ 07 мая 2020

Такое поведение возможно при использовании 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

...