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>"
sind Sie sicher, dass dieser Code tatsächlich? Wie stellen Sie die Delegierten ein? – fabrizioM
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 –