在 QTableWidget 上的 QStyledItemDelegate 中设置突出显示颜色
Setting the Highlight color within a QStyledItemDelegate on a QTableWidget
我在这里引用了 eyllanesc 编写的代码:
当我 QTableWidget
上的单元格被 select 编辑时,我希望显示默认的 select 颜色:
但是,设置 initStyleOption
后,显示的颜色较浅:
我不确定我需要更改什么才能设置新的 Highlight
颜色。
这是我需要在选项传递到 QStyleOptionViewItem
之前更改的内容,还是我需要在 QPalette
或 QStyle
某处更改的内容?
我知道我可以使用 painter.fillRect()
为背景设置颜色,但这会重载默认样式,移除单元格周围的灰色虚线。
我希望我可以通过设置 Highlight
的颜色类似于 stylesheet
的悬停、选中等
来避免重建绘画中的所有内容的需要
下面是我使用的删节代码。
class CustomDelegate(QtWidgets.QStyledItemDelegate):
def __init__(self, *args, **kwargs):
super(CustomDelegate, self).__init__(*args, **kwargs)
self.doc = QtGui.QTextDocument(self)
self.text_edit = None
def paint(self, painter, option, index):
painter.save()
options = QtWidgets.QStyleOptionViewItem(option)
self.initStyleOption(options, index)
self.doc.setPlainText(options.text)
# Resets option text
options.text = ""
style = QtWidgets.QApplication.style() if options.widget is None \
else options.widget.style()
#print(option.palette.highlight())
#print(style.standardPalette().highlight())
#print (dir(style.standardPalette()))
style.drawControl(QtWidgets.QStyle.CE_ItemViewItem, options, painter)
# Set text colour
paint_context = QtGui.QAbstractTextDocumentLayout.PaintContext()
if option.state & QtWidgets.QStyle.State_Selected:
paint_context.palette.setColor(QtGui.QPalette.Text, option.palette.color(QtGui.QPalette.Active, QtGui.QPalette.HighlightedText))
#painter.fillRect(option.rect, QtGui.QColor("green"))
else:
paint_context.palette.setColor(QtGui.QPalette.Text, option.palette.color(QtGui.QPalette.Active, QtGui.QPalette.Text))
option.palette.setColor(QtGui.QPalette.Background, QtCore.Qt.black)
painter.translate(text_rect.topLeft())
painter.setClipRect(text_rect.translated(-text_rect.topLeft()))
self.doc.documentLayout().draw(painter, paint_context)
painter.restore()
return
不幸的是,我无法找到如何更改控件元素的样式,但将选项小部件添加到 drawControl
似乎 return 了正确的颜色。
style.drawControl(QtWidgets.QStyle.CE_ItemViewItem, options, painter)
更改为:
style.drawControl(QtWidgets.QStyle.CE_ItemViewItem, options, painter, options.widget)
我在这里引用了 eyllanesc 编写的代码:
当我 QTableWidget
上的单元格被 select 编辑时,我希望显示默认的 select 颜色:
但是,设置 initStyleOption
后,显示的颜色较浅:
我不确定我需要更改什么才能设置新的 Highlight
颜色。
这是我需要在选项传递到 QStyleOptionViewItem
之前更改的内容,还是我需要在 QPalette
或 QStyle
某处更改的内容?
我知道我可以使用 painter.fillRect()
为背景设置颜色,但这会重载默认样式,移除单元格周围的灰色虚线。
我希望我可以通过设置 Highlight
的颜色类似于 stylesheet
的悬停、选中等
下面是我使用的删节代码。
class CustomDelegate(QtWidgets.QStyledItemDelegate):
def __init__(self, *args, **kwargs):
super(CustomDelegate, self).__init__(*args, **kwargs)
self.doc = QtGui.QTextDocument(self)
self.text_edit = None
def paint(self, painter, option, index):
painter.save()
options = QtWidgets.QStyleOptionViewItem(option)
self.initStyleOption(options, index)
self.doc.setPlainText(options.text)
# Resets option text
options.text = ""
style = QtWidgets.QApplication.style() if options.widget is None \
else options.widget.style()
#print(option.palette.highlight())
#print(style.standardPalette().highlight())
#print (dir(style.standardPalette()))
style.drawControl(QtWidgets.QStyle.CE_ItemViewItem, options, painter)
# Set text colour
paint_context = QtGui.QAbstractTextDocumentLayout.PaintContext()
if option.state & QtWidgets.QStyle.State_Selected:
paint_context.palette.setColor(QtGui.QPalette.Text, option.palette.color(QtGui.QPalette.Active, QtGui.QPalette.HighlightedText))
#painter.fillRect(option.rect, QtGui.QColor("green"))
else:
paint_context.palette.setColor(QtGui.QPalette.Text, option.palette.color(QtGui.QPalette.Active, QtGui.QPalette.Text))
option.palette.setColor(QtGui.QPalette.Background, QtCore.Qt.black)
painter.translate(text_rect.topLeft())
painter.setClipRect(text_rect.translated(-text_rect.topLeft()))
self.doc.documentLayout().draw(painter, paint_context)
painter.restore()
return
不幸的是,我无法找到如何更改控件元素的样式,但将选项小部件添加到 drawControl
似乎 return 了正确的颜色。
style.drawControl(QtWidgets.QStyle.CE_ItemViewItem, options, painter)
更改为:
style.drawControl(QtWidgets.QStyle.CE_ItemViewItem, options, painter, options.widget)