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