ile birden çok QStyledItemDelegate kullanıyorum Çalışmakta olan veri öğeleri için belirli bir delege çözmek için çift gönderme kullanarak bir stil QTreeView oluşturuyorum. Tasarımcıların, kodun dışındaki kullanıcı arayüzünü biçimlendirmesini sağlayan stil sayfalarından yararlanmak için QStyledItemDelegate'ten delegeleri alt sınıflara ayırdım.Stil sayfaları
Ne yazık ki, CSS'den farklı stillere hitap edemedim. Stil sayfasında belirtilen öğe alt kontrol stilini nasıl seçerim?
Birlikte test ediyorum CSS:
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);
}
Benim temsilci render sınıfları:
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>"
bu kod aslında çağrılan eminiz: o kadar yazılmış gibi
stil sayfası rolü bir öğe ile ilişkili gibi görünüyor böylece yazılı olsa bile, kural seçimdir? Delegeleri nasıl belirlersiniz? – fabrizioMPeki, sanal olarak işaretlenmemiş olması dışında itemDelegate (QModelIndex) öğesini geçersiz kılmayı tercih ederdim. Bunun yerine, [Python ve Qt ile Hızlı GUI Programlama] [1] 'da benzer bir soyutlamadan sonra modellenen 'setItemDelegate (VisitingDelegate())' komutunu kullanıyorum. Ne yazık ki, kitap sürümü, temsilcilerle CSS kullanarak ele almıyor. [1]: http://www.qtrac.eu/pyqtbook.html –