2009-12-30 15 views
12

Estoy creando un estilo QTreeView utilizando el envío doble para resolver el delegado específico para los elementos de datos, que funciona muy bien. Subclasé a los delegados de QStyledItemDelegate para aprovechar las hojas de estilo, lo que permitió a los diseñadores diseñar la interfaz de usuario fuera del código.Uso de QStyledItemDelegate múltiple con hojas de estilo

Desafortunadamente, no he podido abordar diferentes estilos desde el CSS. ¿Cómo selecciono y uso el estilo de subcontrol del elemento especificado en la hoja de estilo?

El CSS Estoy probando 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); 
} 

Mis delegar la representación clases:

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

está usted seguro de que este código se llama en realidad? ¿cómo se establece a los delegados? – fabrizioM

+0

Bueno, hubiera preferido reemplazar itemDelegate (QModelIndex), excepto que no está marcado como virtual. En su lugar utilizo 'setItemDelegate (VisitingDelegate())', modelado después de una abstracción similar en [Rapid GUI Programming with Python and Qt] [1]. Desafortunadamente, la versión del libro no aborda el uso de CSS con los delegados. [1]: http://www.qtrac.eu/pyqtbook.html –

Respuesta

1

Diferentes estilos no se pueden seleccionar de esa manera. Las propiedades para seleccionar la regla de la hoja de estilo se toman de un QWidget (un QTreeView en este caso), no de un delegado. El delegado no es un widget, y no hay un widget que represente elementos individuales. Su ejemplo puede mostrar esto añadiendo una impresión donde el estilo se obtiene desde el widget:

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

Se mostrará que el widget para el estilo de un QTreeView. Como el widget es el mismo para ambos delegados, no puede tener una configuración de rol que tenga dos valores.

A pesar de que la hoja de estilo está escrito de manera que parece que el papel está asociado con un elemento, la selección de reglas es como se escribe como:

QTreeView[role="title"]::item:selected 
Cuestiones relacionadas