Как мне изменить только цвет фона моего элемента дерева с помощью делегата?
Я не смог понять, как это сделать, не рисуя поверх текста. Другими словами, когда я использую приведенный ниже код, цвет рисуется поверх текста. Текст находится под фоном...
def paint(self, painter, option, index):
MyDelegate.paint(self, painter, option, index)
painter.save()
# set background color
painter.setPen(QPen(Qt.NoPen))
if self.item.is_set and option.state & QStyle.State_Selected:
painter.setBrush(QBrush(QtGui.QColor(100, 200, 0, 200)))
else:
painter.setBrush(QBrush(Qt.NoBrush))
painter.drawRect(option.rect)
painter.restore()
Я хочу унаследовать столько, сколько смогу.
...
Что касается комментариев, я попытался применить ответ " Установить цвет для строки QTableView "... но я не могу заставить его работать на Python. Я не уверен, как optionV4.backgroundBrush() как-то влияет. Используется ли опция по ссылке, так что это изменение должно использоваться без возвращаемого значения?
(Они используются без переопределения paint)
def initStyleOption(self, option, index):
print("initStyleOption...")
MyBaseDelegate.initStyleOption(self, option, index)
optionV4 = QtGui.QStyleOptionViewItemV4(option)
optionV4.backgroundBrush = QBrush(QtGui.QColor(100, 200, 100, 200))
Я также пробовал это:
def initStyleOption(self, option, index):
MyBaseDelegate.initStyleOption(self, option, index)
option.backgroundBrush = QBrush(QtGui.QColor(100, 200, 100, 200))
...и это:
def initStyleOption(self, option, index):
option.backgroundBrush = QBrush(QtGui.QColor(100, 200, 100, 200))
MyBaseDelegate.initStyleOption(self, option, index)
И, согласно документам, это ничего не должно возвращать, поэтому я предполагаю, что опция IS передается по ссылке, что имеет смысл.
Я нашел другой пример, который работает (хотя я не пытался его понять)
def paint(self, painter, option, index):
option = QtGui.QStyleOptionViewItemV4(option) # Needed for "widget"
self.initStyleOption(option, index) # <--- I did not override this
option.backgroundBrush = QBrush(QtGui.QColor(100, 200, 100, 200))
option.widget.style().drawControl(QStyle.CE_ItemViewItem, option, painter)
ColumnBaseDelegate.paint(self, painter, option, index)
... но цвет фона закрашивается цветом выделения. Поскольку я пытаюсь изменить цвет фона при выборе элемента, это проблема. Есть ли другая кисть или метод для работы с цветами выделения? Мне нужно, чтобы определенные типы предметов были другого цвета.
Я попробовал ответ, который демонстрирует инвертирование состояния выбора перед рисованием собственного фона, но по какой-то причине он нарисовал для меня пустой фон. А вот покраска сработала...
def paint(self, painter, option, index):
if option.state & QStyle.State_Selected:
option.state &= ~QStyle.State_Selected # Invert state
# This "cast", which is needed to get option.widget, seems to be
# needed for backgroundBrush as well.
option = QtGui.QStyleOptionViewItemV4(option) # Cast for widget
option.backgroundBrush = QBrush(QColor(100, 200, 100, 200))
option.widget.style().drawControl(QStyle.CE_ItemViewItem, option, painter)
super(MyDelegate, self).paint(painter, option, index)
Я не понимаю, почему, поэтому я не буду добавлять это к ответу на данный момент.
option.backgroundBrush = QBrush(...). И да, аргументoptionявляется возвращаемым значением. - person alexisdm   schedule 08.06.2012