2012-04-05 18 views
1

Ich habe versucht, eine TabeView zu erhalten, um eine seiner Spalten als ComboBoxes anzuzeigen. Um dies zu tun, habe ich den Code für einen benutzerdefinierten Delegaten geschrieben:Benutzerdefinierter Delegat in PySide

class comboBoxDelegate(QStyledItemDelegate): 

def __init__(self, model, parent=None): 
    super(comboBoxDelegate, self).__init__(parent) 
    self.parent= parent 
    self.model= model 

def createEditor(self, parent, option, index): 

    if not index.isValid(): 
     return False 

    self.currentIndex=index 

    self.comboBox = QComboBox(parent) 
    self.comboBox.setModel(self.model) 
    value = index.data(Qt.DisplayRole) 
    self.comboBox.setCurrentIndex(value) 

    return self.comboBox 

def setEditorData(self, editor, index): 
    value = index.data(Qt.DisplayRole) 
    editor.setCurrentIndex(value) 

def setModelData(self, editor, model, index): 

    if not index.isValid(): 
     return False 

    index.model().setData(index, editor.currentIndex(), Qt.EditRole) 

def paint(self, painter, option, index): 
    currentIndex= index.data(Qt.DisplayRole) 

    opt= QStyleOptionComboBox() 
    opt.rect= option.rect 
    currentComboIndex= self.model.createIndex(currentIndex,0) 
    opt.currentText= self.model.data(currentComboIndex, Qt.DisplayRole) 

    QApplication.style().drawComplexControl(QStyle.CC_ComboBox, opt, painter) 

Das Problem ist, dass, wenn ich es versuchen, die comboBox keinen Text zunächst nicht zeigen (nur, wenn Sie auf geklickt haben es). Es scheint, dass die CurrentText-Eigenschaft nicht funktioniert. Jede Hilfe wird geschätzt.

+0

Haben Sie überprüft, ob 'self.model.data (currentComboIndex, Qt.DisplayRole)' tatsächlich eine gültige Zeichenfolge zurückgibt? – Masci

+0

Danke und ja, es gibt eine Zeichenfolge zurück –

Antwort

0

Ich denke, Sie sollten Elternklasse paint() -Methode aufrufen. Hinzufügen:

QStyledItemDelegate.paint(self, painter, option, index) 

am Ende des Lackes Methode in Ihrer Klasse, nach dem Aufruf von drawComplexControl

+0

Es funktioniert, danke! –

+0

Durch den Aufruf von 'QStyledItemDelegate.paint (self, painter, options, index)' wird jedes zuvor erstellte Bild vollständig rückgängig gemacht. Wenn Sie dies immer die letzte Aussage von 'paint' nennen, dann können Sie' paint' auch nicht überschreiben. – Nathan

1

Sie QStyledItemDelegate.displayText() Methode außer Kraft setzen können, um Ihre Delegierten Anzeigetext, ohne Farbe Neuimplementierung(). Etwas wie

class comboBoxDelegate(QStyledItemDelegate): 
    ... 
    def displayText(self, value, locale=None): 
     return get_appropriate_text_representation_for_value(value) 
2

Ich weiß, das ist alt, aber Sie müssen wirklich nicht mit dem Gemälde überhaupt beschäftigen. Die Combobox zeigt keinen Wert an, da der Combobox-aktuelle Index wahrscheinlich als Zeichenfolge anstelle von int festgelegt wurde.

Dieser Delegat zeigt nur das Kombinationsfeld an, wenn das Element bearbeitet wird, andernfalls zeigt es einen normalen Textelementdelegaten an.