2009-09-11 3 views
4

Alors, voici l'histoire:personnalisée QStyledItemDelegate: ajout d'éléments gras

J'ai un QListView qui utilise un QSqlQueryModel pour le remplir. Étant donné que certains éléments doivent 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 ainsi hériter de QStyledItemDelegate est le chemin à parcourir en fonction des docs. Je l'ai fonctionné mais il y a quelques problèmes avec lui.

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 que je suis maintenant face:

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

Maintenant la question:

Y at-il une autre façon de créer un délégué personnalisé qui ne change que le poids de la police quand une condition est remplie et laisse tout le reste intact?

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. Aucune erreur, comportement par défaut et aucun élément en gras.

Toutes les suggestions sont les bienvenues!

Répondre

3

Je n'ai pas testé, mais je pense que vous pouvez 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) 
Questions connexes