QTableView. Изменить цвет фона строки по условию.



  • Здравствуйте уважаемые Киютишники, столкнулся я с сей проблемой - не знаю как изменить цвет строки по определенному условию в элементе QTableView. Было необходимо переопределить некоторые методы класса QTableView и я унаследовал от него свой собственный класс Table и переопределил их там. Для загрузки таблицы в компонент Table я используя объект класса QSqlTableModel. Пытался сделать это через StyleSheet - но смог меня только цвет всех строк сразу. Пытался найти атрибут или метод который будет отвечать за присвоение цветов заднего фона к определенной строке Таблицы - безуспешно, нашел только alternativeRowColor который чередует 2 системных цвета на четные и нечетные строки. Нашел еще примеры на С++ с использованием делегатов, и пытаясь перевести код на язык Python смог сделать только смену цвета текста выделенной строки, но не ее фона и уж тем более не по срабатыванию условия (очевидно это по событию). Я буду очень благодарен тому кто поможет решить мне эту проблему, потому что это уже перешло на личное разберательство. Программирую на Python 2.7.5 используя С++ библиотеки Qt V 4.8. Буду рад ЛЮБОМУ коду на ЛЮБОМ языке. Спасибо в заранее всем. С уважением - ваш коллега.



  • И вам привет.
    Вы можете менять цвет фона не используя делегат а просто добавив условие в модель:

    @QVariant data(const QModelIndex &index, int role)
    {
    if (role == Qt::BackgroundRole) {
    int row = index.row();
    QColor color = getColorForRow(row);
    return QBrush(color);
    }
    //.....
    //
    //....
    }@
    а в методе getColorForRow производить необходимые действия для определения цвета конкретной строки.
    Или же можно не наследуя модель присвоить цвет ячейке:
    @ui->tableView->model()->setData(index,color,Qt::BackgroundRole);@
    но этого делать не рекомендую.



  • Спасибо, В общем я сделал как ты говорил и все сработало. Сделал я следующее. Объявил свой собственный класс Model и унаследовал его от QSqlTableModel. Далее я переопределил метод data у класса Model и в случае если метод вызывался системой Qt для того что установить то какой именно цвет фона ячейки надо использовать я вычисляю с помощью своей функции цвет и возвращаю его, а так как сам метод data вызывался системой Qt для того чтобы узнать какой цвет фона использовать он будет использовать возвращаемый из этого метода data мною цвет как цвет фона.



  • Вот сам код переопределенной модели. Эту модель использовать для подключения к QTableView вот так:
    <Имя объекта QTableView>.setModel(<Имя объекта Model>)



  • @# # -- coding: utf-8 --

    author = 'zaur'

    from PySide import QtCore, QtGui, QtSql

    """
    Класс модель который будет переопределять способ отрисовки себя на экране
    """

    class Model(QtSql.QSqlTableModel):

    # Инициализируем данные конструктором через родительский метод инициализации
    def __init__(self, parent=0, db=QtSql.QSqlDatabase()):
        # Вызываем родительский метод инициализации, 1-й параметр родитель,
        # 2-й параметр база данных к которой надо плдключиться
        super(Model, self).__init__(parent, db)
    
    # Переопределяем метод дата, он принимает обычно 2 параметра,
    # 1-й индекс ячейки, 2-й роль - то есть этот параметр укажет к чему именно применяется этот метод,
    # например к цвету фона, к цвету текста, к отображению данных,
    # к подсвеченному цвету выбранной ячейки и т.д. (насколько я понял)
    def data(self, index, role):
        # Если метод вызвался системой Qt для того чтобы выяснить
        # какой цвет фона использовать (для ячейки index) то..
        if role == QtCore.Qt.BackgroundRole:
            # Вычислить нужный цвет и вернуть его из функции (которая определена ниже)
            # (возвращать надо QBrush объект с установленным необходимым цветом)
            return QtGui.QBrush(self.getColorForRow(index))
        # Иначе, если метод вызывался системой Qt для того, чтобы определить цвет текста то..
        elif role == QtCore.Qt.TextColorRole:
            # Вернуть цвет текста, который мне нравится
            return QtGui.QBrush(QtGui.QColor.fromRgb(64, 64, 64))
        # Иначе (Не забывайте выполнить метод дата определенный в родителе,
        # потому что, мы переопределили только 2 роли, а их много, поэтому,
        # мы должны вызвать метод data родительского класса и передать ему те же самые параметры
        # которые принимает наш метод data, а метод data родительского класса уже сам решит
        # в какой ситуации что использовать (по умолчанию))
        else:
            # Выполнить метод data родителя и вернуть результат который вернет родительский метод data.
            return super(Model, self).data(index, role)
    
    # Метод который вычисляет необходимый цвет, принимает 1 параметр: index - это индекс ячейки
    def getColorForRow(self, index):
    
        # Определяем модель по индексу
        model = index.model()
    
        # Если это 2й или 3й столбец то..
        if index.column() in [1, 2]:
    
            # определить 4 столбец этой же строки в таблице (с текстом резолюции)
            third_column = model.index(index.row(), 3, QtCore.QModelIndex())
    
            # Определить резолюцию по только что вычисленному индексу
            resolution = model.data(third_column, QtCore.Qt.DisplayRole)
    
            # Чтобы чередовать цвета по четным и нечетным (нечетная светлее, четная темнее) поставим условие
            # Если строка четная то..
            if index.row() % 2 == 0:
                # если у нее резолюция не пустая (что-то написано в ячейке) то..
                if resolution:
                    # Вернуть зеленоватый цвет
                    return QtGui.QColor.fromRgb(60, 179, 127)
                # Иначе
                else:
                    # Вернуть сероватый цвет
                    return QtGui.QColor.fromRgb(224, 224, 224)
            # Иначе (если строка нечетная)
            else:
                # Если резолюция не пустая то..
                if resolution:
                    # Вернуть темно зеленоватый цвет
                    return QtGui.QColor.fromRgb(28, 147, 95)
                # Иначе
                else:
                    # Вернуть темно сероватый цвет
                    return QtGui.QColor.fromRgb(192, 192, 192)# @

Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.