2009-12-30 24 views
12

Sto creando un QTreeView con stile utilizzando il doppio invio per risolvere il delegato specifico per gli elementi di dati, che funziona perfettamente. Ho sottoclassato i delegati da QStyledItemDelegate per sfruttare i fogli di stile, consentendo ai designer di personalizzare l'interfaccia utente al di fuori del codice.Utilizzo di più QStyledItemDelegate con fogli di stile

Purtroppo, non sono stato in grado di gestire stili diversi dal CSS. Come seleziono e utilizzo lo stile di sottocontrollo dell'articolo specificato nel foglio di stile?

Il CSS sto testando con:

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

mio delegato di rendering classi:

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

Sei sicuro che questo codice viene effettivamente chiamato? come si impostano i delegati? – fabrizioM

+0

Bene, avrei preferito sovrascrivere itemDelegate (QModelIndex), tranne che non è contrassegnato come virtuale. Invece uso 'setItemDelegate (VisitingDelegate())', modellato su un'astrazione simile in [Rapid GUI Programming with Python and Qt] [1]. Sfortunatamente, la versione del libro non affronta l'uso di CSS con i delegati. [1]: http://www.qtrac.eu/pyqtbook.html –

risposta

1

stili differenti non può essere selezionata in quel modo. Le proprietà per la selezione della regola del foglio di stile sono prese da un QWidget (un QTreeView in questo caso), non da un delegato. Il delegato non è un widget e non esiste un widget che rappresenti singoli elementi. Il vostro esempio può mostrare questo con l'aggiunta di una stampa in cui lo stile è ottenuto dal widget:

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

Mostrerà che il widget per lo stile di un QTreeView. Poiché il widget è lo stesso per entrambi i delegati, non può avere un ruolo impostato su due valori.

Anche se il foglio di stile è scritto in modo tale che sembra che il ruolo è associato ad un elemento, la selezione regola è come se fosse stato scritto come:

QTreeView[role="title"]::item:selected 
Problemi correlati