gpt4 book ai didi

colors - PyQt 组合框中单行中的不同颜色

转载 作者:行者123 更新时间:2023-12-04 16:12:05 24 4
gpt4 key购买 nike

我正在使用 PyQt 开发一个 UI,我的 Qcombobox 中的单个项目可以有两个或三个用逗号分隔的单词。因此,例如,项目 1 可以是“Text1、Text2、Text3”,项目 2 可以是“Text4、Text5”。

我想要做的是为 itemText 中由“,”分隔的项目提供多种背景颜色。因此,对于第 1 项('Text1、Text2、Text3'),我需要在 Text1 后面使用一种颜色,在 Text2 后面使用不同的颜色第三个在 Text3 之后。同样,项目 2 将有 2 种背景颜色。

我在考虑使用 rtf 格式,但想不出一种方法可以为一个项目行提供多种颜色。

谢谢你的帮助。

最佳答案

一种方法是使用 QTextDocument为组合框项呈现富文本(通过自定义 delegate ),并将富文本转换回组合框当前文本的纯文本(通过其 paint event )。

这将允许您为项目文本使用 html,如下所示:

    self.combo = RichTextCombo(self)
self.combo.addItem("""
<span style="background-color: blue">Blue</span>
<span style="background-color: red">Red</span>
""")

这是组合框类:

class RichTextCombo(QtGui.QComboBox):
def __init__(self, *args, **kwargs):
super(RichTextCombo, self).__init__(*args, **kwargs)
self._document = QtGui.QTextDocument(self)
self._delegate = RichTextDelegate(self)
self.setItemDelegate(self._delegate)
self.setSizeAdjustPolicy(
QtGui.QComboBox.AdjustToMinimumContentsLength)

def paintEvent(self, event):
painter = QtGui.QStylePainter(self)
painter.setPen(self.palette().color(QtGui.QPalette.Text))
options = QtGui.QStyleOptionComboBox()
self.initStyleOption(options)
self._document.setHtml(options.currentText)
options.currentText = self._document.toPlainText()
painter.drawComplexControl(QtGui.QStyle.CC_ComboBox, options)
painter.drawControl(QtGui.QStyle.CE_ComboBoxLabel, options)

这是自定义项目委托(delegate):

class RichTextDelegate(QtGui.QStyledItemDelegate):
def __init__(self, *args, **kwargs):
super(RichTextDelegate, self).__init__(*args, **kwargs)
self._document = QtGui.QTextDocument(self)

def paint(self, painter, option, index):
options = QtGui.QStyleOptionViewItemV4(option)
self.initStyleOption(options, index)
if options.widget is not None:
style = options.widget.style()
else:
style = QtGui.QApplication.style()
self._document.setHtml(options.text)
options.text = ''
style.drawControl(QtGui.QStyle.CE_ItemViewItem, options, painter)
context = QtGui.QAbstractTextDocumentLayout.PaintContext()
if options.state & QtGui.QStyle.State_Selected:
context.palette.setColor(
QtGui.QPalette.Text, options.palette.color(
QtGui.QPalette.Active, QtGui.QPalette.HighlightedText))
textRect = style.subElementRect(
QtGui.QStyle.SE_ItemViewItemText, options)
painter.save()
painter.translate(textRect.topLeft())
painter.setClipRect(textRect.translated(-textRect.topLeft()))
self._document.documentLayout().draw(painter, context)
painter.restore()

def sizeHint(self, option, index):
options = QtGui.QStyleOptionViewItemV4(option)
self.initStyleOption(options,index)
self._document.setHtml(options.text)
self._document.setTextWidth(options.rect.width())
return QtCore.QSize(self._document.idealWidth(),
self._document.size().height())

关于colors - PyQt 组合框中单行中的不同颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21141757/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com