Pregunta

Así que aquí está la historia:

Tengo una QListview que usa un QSqlQueryModel para llenarlo. Debido a que algunos elementos deberían aparecer en negrita según el valor de una columna oculta del modelo, decidí hacer mi propio delegado personalizado. Estoy usando PyQT 4.5.4 y, por lo tanto, heredar de QStyledItemDelegate es el camino a seguir según los documentos. Lo tengo funcionando pero hay algunos problemas con él.

Aquí está mi solución:

class TypeSoortDelegate(QStyledItemDelegate):

    def paint(self, painter, option, index):
        model = index.model()
        record = model.record(index.row())
        value= record.value(2).toPyObject()
        if value:
            painter.save()
            # change the back- and foreground colors
            # if the item is selected
            if option.state & QStyle.State_Selected:
                painter.setPen(QPen(Qt.NoPen))
                painter.setBrush(QApplication.palette().highlight())
                painter.drawRect(option.rect)
                painter.restore()
                painter.save()
                font = painter.font
                pen = painter.pen()
                pen.setColor(QApplication.palette().color(QPalette.HighlightedText))
                painter.setPen(pen)
            else:
                painter.setPen(QPen(Qt.black))

            # set text bold
            font = painter.font()
            font.setWeight(QFont.Bold)
            painter.setFont(font)
            text = record.value(1).toPyObject()
            painter.drawText(option.rect, Qt.AlignLeft, text)

            painter.restore()
        else:
            QStyledItemDelegate.paint(self, painter, option, index)

Los problemas que estoy enfrentando ahora:

  1. los elementos normales (no en negrita) son ligeramente sangrado (unos pocos píxeles). Esto es probablemente algo predeterminado comportamiento. Podría sangrar mi artículo en negrita también, pero qué pasa entonces bajo una plataforma diferente?
  2. Normalmente cuando selecciono elementos hay un pequeño borde con una línea de puntos alrededor (¿cosa predeterminada de Windows?). Aquí también podría dibujarlo, pero quiero permanecer lo más nativo posible.

Ahora la pregunta:

¿Hay otra forma de crear un delegado personalizado que solo cambie el peso de la fuente cuando se cumpla alguna condición y deje todo el resto intacto?

También probé:

if value:
    font = painter.font()
    font.setWeight(QFont.Bold)
    painter.setFont(font)
QStyledItemDelegate.paint(self, painter, option, index)

Pero eso no parece afectar la apariencia en absoluto. Sin error, solo comportamiento predeterminado y sin elementos en negrita.

¡Todas las sugerencias son bienvenidas!

¿Fue útil?

Solución

No he probado esto, pero creo que puedes hacer:

class TypeSoortDelegate(QStyledItemDelegate):

def paint(self, painter, option, index):
    get value...
    if value:
        option.font.setWeight(QFont.Bold)

    QStyledItemDelegate.paint(self, painter, option, index)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top