2009-12-30 13 views
12

के साथ एकाधिक QStyledItemDelegate का उपयोग करके मैं डेटा आइटम के लिए विशिष्ट प्रतिनिधि को हल करने के लिए डबल-प्रेषण का उपयोग करके एक स्टाइल QTreeView बना रहा हूं, जो कि बहुत अच्छा काम कर रहा है। मैंने स्टाइलशीट का लाभ लेने के लिए QStyledItemDelegate से प्रतिनिधियों को उप-वर्गीकृत किया, जिससे डिजाइनरों को कोड के बाहर यूआई को स्टाइल करने में सक्षम बनाया गया।स्टाइलशीट्स

दुर्भाग्य से, मैं सीएसएस से विभिन्न शैलियों को संबोधित करने में असमर्थ रहा हूं। मैं स्टाइलशीट में निर्दिष्ट आइटम उप-नियंत्रण शैली का चयन और उपयोग कैसे करूं?

सीएसएस मैं के साथ परीक्षण कर रहा हूँ:

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); 
} 

मेरे प्रतिनिधि प्रतिपादन कक्षाएं:

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

क्या आप वाकई इस कोड को वास्तव में कहा जाता हो जाता है कर रहे हैं:

हालांकि शैली पत्रक में लिखा है इतना है कि यह लग रहा है भूमिका की तरह एक आइटम के साथ जुड़ा हुआ है, नियम चयन है जैसे कि यह के रूप में लिखा गया है? आप प्रतिनिधियों को कैसे सेट करते हैं? – fabrizioM

+0

ठीक है, मैं आइटम डिलीगेट (QModelIndex) को ओवरराइड करना पसंद करता हूं, सिवाय इसके कि यह वर्चुअल चिह्नित नहीं है। इसके बजाय मैं 'setItemDelegate (VisitingDelegate())' का उपयोग करता हूं, [पाइथन और क्यूटी के साथ रैपिड जीयूआई प्रोग्रामिंग] [1] में एक समान अमूर्तता के बाद मॉडलिंग किया गया। दुर्भाग्यवश, पुस्तक संस्करण प्रतिनिधियों के साथ सीएसएस का उपयोग नहीं करता है। [1]: http://www.qtrac.eu/pyqtbook.html –

उत्तर

1

विभिन्न शैलियों कि जिस तरह से चयन नहीं किया जा सकता है। स्टाइल शीट नियम का चयन करने के लिए गुण QWidget (इस मामले में एक QTreeView) से लिया जाता है, एक प्रतिनिधि नहीं। प्रतिनिधि एक विजेट नहीं है, और व्यक्तिगत आइटम का प्रतिनिधित्व करने वाला विजेट नहीं है। आपका उदाहरण एक प्रिंट जहां शैली विजेट से प्राप्त होता है जोड़कर इस दिखा सकते हैं:

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

यह दिखा देंगे कि शैली एक QTreeView के लिए विजेट। चूंकि विजेट दोनों प्रतिनिधियों के लिए समान है, इसलिए इसमें कोई भूमिका सेटिंग नहीं हो सकती है जो दो मान है।

QTreeView[role="title"]::item:selected 
संबंधित मुद्दे

 संबंधित मुद्दे