2009-12-30 6 views
12

Je crée un QTreeView de style en utilisant la double répartition pour résoudre un délégué spécifique pour les éléments de données, ce qui fonctionne très bien. J'ai sous-classé les délégués de QStyledItemDelegate pour tirer parti des feuilles de style, permettant aux concepteurs de mettre en forme l'interface utilisateur en dehors du code.Utilisation de plusieurs QStyledItemDelegate avec des feuilles de style

Malheureusement, j'ai été incapable d'adresser différents styles du CSS. Comment sélectionner et utiliser le style de sous-contrôle d'élément spécifié dans la feuille de style?

Le CSS je teste avec:

QTreeView::item:selected { 
    background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #dddddd, stop: 1 #888888); 
} 
QTreeView::item:selected[role="title"] { 
    background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #fde7ef, stop: 1 #f1cbda); 
} 
QTreeView::item:selected[role="entry"] { 
    background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #e7effd, stop: 1 #cbdaf1); 
} 

Mon délégué de rendu des classes:

class VisitingDelegate(QtGui.QAbstractItemDelegate): 
    def __init__(self, parent=None): 
     super(VisitingDelegate,self).__init__(parent) 
     roles = {} 
     self.renderRoles = roles 

     d = TitleDelegate(parent) 
     d.setProperty("role", "title") 
     roles['title'] = d 

     d = EntryDelegate(parent) 
     d.setProperty("role", "entry") 
     roles['entry'] = d 

    def delegateForIndex(self, mi): 
     role = mi.model().data(mi, "renderRole") 
     return self.renderRoles[role] 

    def paint(self, painter, option, mi): 
     dg = self.delegateForIndex(mi) 
     return dg.paint(painter, option, mi) 
    def sizeHint(self, option, mi): 
     dg = self.delegateForIndex(mi) 
     return dg.sizeHint(option, mi) 

class TextDocumentDelegate(QtGui.QStyledItemDelegate): 
    fmt = "<font color='%(color)s'>%(text)s</font)>" 
    def paint(self, painter, option, mi): 
     painter.save() 

     opt = QtGui.QStyleOptionViewItemV4(option) 
     self.initStyleOption(opt, mi) 
     opt.text = '' 

     style = opt.widget.style() 
     style.drawControl(style.CE_ItemViewItem, opt, painter, opt.widget) 

     textRect = style.subElementRect(style.SE_ItemViewItemText, opt, opt.widget); 
     doc = self.asTextDoc(option, mi) 
     painter.translate(textRect.topLeft()) 
     doc.drawContents(painter) 

     painter.restore() 

    def sizeHint(self, option, mi): 
     doc = self.asTextDoc(option, mi) 
     sz = doc.size() 
     sz = QtCore.QSize(sz.width(), sz.height()) 
     return sz 

    def asTextDoc(self, option, mi): 
     info = {} 
     info['text'] = mi.model().data(mi, Qt.DisplayRole) 

     doc = QtGui.QTextDocument() 
     doc.setDefaultFont(option.font) 
     pal = option.palette 
     if option.state & QtGui.QStyle.State_Selected: 
      color = pal.color(pal.HighlightedText) 
     else: color = pal.color(pal.Text) 
     info['color'] = color.name() 

     doc.setHtml(self.fmt % info) 
     return doc 

class EntryDelegate(TextDocumentDelegate): 
    pass 
class TitleDelegate(TextDocumentDelegate): 
    fmt = "<h3><font color='%(color)s'>%(text)s</font)></h3>" 
+0

êtes-vous sûr que ce code est en fait appelé? comment définissez-vous les délégués? – fabrizioM

+0

Eh bien, j'aurais préféré substituer itemDelegate (QModelIndex), sauf qu'il n'est pas marqué virtuel. Au lieu de cela, j'utilise 'setItemDelegate (VisitingDelegate())', modélisé d'après une abstraction similaire dans [Rapid GUI Programming avec Python et Qt] [1]. Malheureusement, la version du livre ne traite pas de l'utilisation de CSS avec les délégués. [1]: http://www.qtrac.eu/pyqtbook.html –

Répondre

1

styles différents ne peuvent pas être sélectionnés de cette façon. Les propriétés de sélection de la règle de feuille de style proviennent d'un QWidget (un QTreeView dans ce cas), pas d'un délégué. Le délégué n'est pas un widget et il n'y a pas de widget représentant des éléments individuels. Votre exemple peut montrer en ajoutant une impression où le style est obtenu à partir du widget:

style = opt.widget.style() 
print opt.widget 

Il montrera que le widget pour le style un QTreeView. Puisque le widget est le même pour les deux délégués, il ne peut pas avoir un paramètre de rôle qui soit deux valeurs.

Même si la feuille de style est écrit de sorte qu'il semble que le rôle est associé à un élément, la sélection de la règle est comme il a été écrit:

QTreeView[role="title"]::item:selected 
Questions connexes