QStyledItemDelegate personalizado: adicionar itens em negrito
-
05-07-2019 - |
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:
- 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?
- 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!
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)