2009-12-30 4 views
12

Ich erstelle eine formatierte QTreeView mit Double-Dispatch, um bestimmte Delegaten für Datenelemente aufzulösen, die funktioniert gut. Ich habe die Delegierten von QStyledItemDelegate subclassiert, um Stylesheets zu nutzen und den Designern zu ermöglichen, die Benutzeroberfläche außerhalb des Codes zu gestalten.Verwenden von mehreren QStyledItemDelegate mit Stylesheets

Leider konnte ich verschiedene Stile aus dem CSS nicht ansprechen. Wie wähle und verwende ich den im Stylesheet angegebenen Stil für die Untersteuerung von Elementen?

Die CSS ich mit dem Testen bin:

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); 
} 

Meine Delegierten Rendering Klassen:

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

sind Sie sicher, dass dieser Code tatsächlich? Wie stellen Sie die Delegierten ein? – fabrizioM

+0

Nun, ich hätte es vorgezogen, itemDelegate (QModelIndex) zu überschreiben, außer dass es nicht als virtuell markiert ist. Stattdessen verwende ich 'setItemDelegate (VisitingDelegate())', modelliert nach einer ähnlichen Abstraktion in der [Rapid GUI Programming with Python and Qt] [1]. Leider behandelt die Buchversion CSS nicht mit den Delegierten. [1]: http://www.qtrac.eu/pyqtbook.html –

Antwort

1

Verschiedene Stile können nicht auf diese Weise ausgewählt werden. Die Eigenschaften zum Auswählen der Stylesheet-Regel stammen aus einem QWidget (in diesem Fall einem QTreeView), nicht einem Delegaten. Der Delegat ist kein Widget und es gibt kein Widget, das einzelne Elemente darstellt. Ihr Beispiel kann dies zeigen, indem sie einen Druck hinzugefügt werden, wobei der Stil aus dem Widget erhalten:

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

Es dass das Widget für den Stil eines QTreeView zeigen. Da das Widget für beide Delegaten identisch ist, kann es keine Rolleneinstellung mit zwei Werten geben.

Auch wenn das Stylesheet ist so geschrieben, dass es aussieht wie die Rolle mit einem Element zugeordnet ist, ist die Regelauswahl wie es geschrieben wurde: wird aufgerufen

QTreeView[role="title"]::item:selected 
Verwandte Themen