如何使用代理只更改树形项的背景颜色?
我没有找到不在文本上绘制的情况下如何实现这一点的方法。换句话说,当我使用下面的代码时,颜色会绘制在文本上方。文本位于背景下方...
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)
根据文档,这应该不返回任何内容,因此我认为选项通过引用传递,这是有道理的。
我找到了另一个示例,它可以正常工作(尽管我还没有尝试理解它)
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)
...但是选定颜色会覆盖背景色。由于我尝试在项目被选中时更改背景色,这是一个问题。是否有不同的画刷或方法可以处理选择颜色?我需要某些类型的项目显示不同的颜色。
我尝试了答案,演示了绘制自己的背景之前反转选择状态,但出于某种原因它为我绘制了一个空背景。把它放在Paint中起作用……
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
参数就是返回值。 - alexisdm