Как создать делегата для отображения значка и текста QComboBox в QTreeWidget (PyQt)?

У меня возникли проблемы с отображением значка и текста в QTreeWidget . Мой QTreeWidget просто отображает текст! как использовать метод рисования для отображения значка и текста? Большое спасибо! Код выглядит следующим образом:

from PyQt4 import QtGui,QtCore
import sys
class ColorComboBox(QtGui.QComboBox):   
    def __init__(self,parent=None):
        super(ColorComboBox,self).__init__(parent)
        colorList=['yellow','red']       
        for color in colorList:
            pix=QtGui.QPixmap(QtCore.QSize(20,20))
            pix.fill(QtGui.QColor(color))
            self.addItem(QtGui.QIcon(pix),color)           
class CustomsDelegate(QtGui.QStyledItemDelegate):
    def __init__(self,parent=None):
        super(CustomsDelegate,self).__init__(parent)       
    def paint(self,painter,option,index):
        painter.save()                  
        painter.setPen(QtGui.QPen(QtCore.Qt.white))
        value = index.data(QtCore.Qt.DisplayRole)
        if value.isValid():
            text = value.toString() 
            painter.drawText(option.rect, QtCore.Qt.AlignLeft, text)    
        painter.restore()
    def createEditor(self, parent, option, index):
        self.combo = ColorComboBox(parent)
        return self.combo    
    def setEditorData(self, editor, index):
        value = index.model().data(index, QtCore.Qt.EditRole).toString()
        editor.setCurrentIndex(editor.findText(value))        

    def setModelData(self, editor, model, index):
        if editor.currentIndex() >= 0:
            realidx = editor.model().index(editor.currentIndex(), 0) 
            value = editor.model().data(realidx)        
            model.setData(index, value, QtCore.Qt.EditRole)                              
class B(QtGui.QTreeWidget):
    def __init__(self,parent=None):
        super(B,self).__init__(parent)            
        self.setColumnCount(2)      
        x = QtGui.QTreeWidgetItem()
        x.setText(0,'text1')   
        y = QtGui.QTreeWidgetItem()     
        x.setFlags(x.flags()|QtCore.Qt.ItemIsEditable)
        self.addTopLevelItems([x,y])
        self.setItemDelegateForColumn(1,CustomsDelegate(self))     
if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    b = B()
    b.show()
    sys.exit(app.exec_())

person user3134294    schedule 18.04.2014    source источник


Ответы (1)


Для любого из стандартных представлений получение значка не является задачей делегата. Стандартный способ получить значок в представлении — возвращать QIcon всякий раз, когда представление вызывает data(index, Qt::DecorationRole).

Поместите свой код значка в свою модель, и представление позаботится о себе.

person RobbieE    schedule 19.04.2014
comment
Спасибо за это, я также пытался использовать метод рисования, поэтому я рад обнаружить, что это намного проще, но это DecorationRole (QtCore.Qt.DecorationRole). Я взял на себя смелость отредактировать ваш ответ. - person simon; 26.06.2014