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>"
êtes-vous sûr que ce code est en fait appelé? comment définissez-vous les délégués? – fabrizioM
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 –