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)# @