tutorial español creator python user-interface pyqt

español - python y pyqt5



QStyledItemDelegate personalizado: agregar elementos en negrita (1)

Así que aquí está la historia:

Tengo una QListview que usa QSqlQueryModel para llenarla. Como algunos elementos deberían mostrarse en negrita según el valor de una columna oculta del modelo, decidí crear mi propio delegado personalizado. Estoy usando PyQT 4.5.4 y, por lo tanto, heredar de QStyledItemDelegate es el camino a seguir de acuerdo con 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 negrita) están ligeramente sangrados (unos pocos píxeles). Este es probablemente un comportamiento predeterminado. También podría aplicar sangría a mi artículo en negrita, pero ¿qué pasa entonces bajo una plataforma diferente?
  2. Normalmente, cuando selecciono elementos, hay un borde pequeño con una línea punteada alrededor (¿cosa predeterminada de Windows?). Aquí también podría dibujarlo, pero quiero permanecer lo más nativo posible.

Ahora la pregunta:

¿Hay alguna otra manera de crear un delegado personalizado que solo cambie el peso de la fuente cuando se cumple alguna condición y deja intacto el resto?

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 de todo. Sin error, solo comportamiento predeterminado y sin elementos en negrita.

Todas las sugerencias son bienvenidas!


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)