2009-12-30 30 views
12

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>" 
+0

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? – fabrizioM

+0

Peki, 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 –

cevap

1

Farklı stiller bu şekilde seçilemez. Stil sayfası kuralının seçilmesi için özellikler bir temsilci değil, bir QWidget (bu durumda QTreeView) 'den alınır. Temsilci bir widget değildir ve tek tek öğeleri temsil eden bir widget yoktur. Sizin örnek tarzı widget'ından elde edilen bir baskı ekleyerek bu gösterebiliriz: Bu gösterecektir

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

o tarz bir QTreeView için widget. Widget, her iki delege için aynı olduğundan, iki değer olan bir rol ayarına sahip olamaz.

QTreeView[role="title"]::item:selected 
İlgili konular