Pergunta

Então, aqui está a história:

Eu tenho um QListView que usa um QSqlQueryModel para preenchê-lo. Porque alguns itens devem exibir em negrito com base no valor de uma coluna oculta do modelo, eu decidi fazer o meu próprio delegado personalizado. Estou usando PyQt 4.5.4 e, assim, herdar de QStyledItemDelegate é o caminho a percorrer de acordo com os docs. Eu tenho que trabalhar, mas existem alguns problemas com ele.

Aqui está a minha solução:

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)

Os problemas que estou enfrentando agora:

  1. os itens normais (não negrito) são ligeiramente recuado (alguns pixels). Este é provavelmente algum padrão comportamento. Eu poderia recuar meu artigo em Também ousada, mas o que acontece em seguida, sob uma plataforma diferente?
  2. Normalmente quando eu selecionar itens, há uma pequena fronteira com uma linha pontilhada em torno dele (default coisa do Windows?). Aqui também eu poderia desenhá-lo, mas eu quero ficar como nativo quanto possível.

Agora, a pergunta:

Existe outra maneira para criar um delegado personalizado que só muda o peso da fonte quando alguma condição for atendida e as folhas todo o resto intocado?

Eu também tentei:

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

Mas isso não parece afetar a aparência em tudo. Nenhum erro, apenas o comportamento padrão, e há itens em negrito.

Todas as sugestões bem-vindos!

Foi útil?

Solução

Eu não testei isso, mas eu acho que você pode fazer:

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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top