Question

Alors, voici l'histoire:

J'ai un QListview qui utilise un QSqlQueryModel pour le remplir. Certains éléments devant s'afficher en gras en fonction de la valeur d'une colonne masquée du modèle, j'ai décidé de créer mon propre délégué personnalisé. J'utilise PyQT 4.5.4 et donc hériter de QStyledItemDelegate est la voie à suivre en fonction de la documentation. Je l'ai fait fonctionner, mais cela pose quelques problèmes.

Voici ma solution:

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)

Les problèmes auxquels je suis confronté maintenant:

  1. les éléments normaux (non gras) sont légèrement en retrait (quelques pixels). C'est probablement un défaut comportement. Je pourrais mettre mon article en retrait audacieux aussi, mais que se passe-t-il ensuite sous une plate-forme différente?
  2. Normalement, lorsque je sélectionne des éléments, une petite bordure est entourée d'une ligne pointillée (option Windows par défaut?). Ici aussi, je pourrais le dessiner, mais je veux rester aussi natif que possible.

Maintenant la question:

Existe-t-il un autre moyen de créer un délégué personnalisé qui ne modifie le poids de la police que si certaines conditions sont remplies et tout le reste non traité?

J'ai aussi essayé:

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

Mais cela ne semble pas affecter les regards du tout. Pas d'erreur, juste le comportement par défaut et pas d'éléments en gras.

Toutes les suggestions sont les bienvenues!

Était-ce utile?

La solution

Je n'ai pas testé cela, mais je pense que vous pouvez le faire:

class TypeSoortDelegate(QStyledItemDelegate):

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

    QStyledItemDelegate.paint(self, painter, option, index)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top