2017-10-14 197 views
1

設置我的項目的代表,像這樣:該模型被設置爲代理模式的源模型如何在由代理模型處理的模型中爲多個列設置項目代表?

COMBOBOX_ITEMS_FRUITS = ['Apple', 'Banana'] 
COMBOBOX_ITEMS_COLORS = ['Red', 'Green', 'Blue'] 

self.treeview.setItemDelegateForColumn(COLUMN_A, ComboBoxDelegate(COMBOBOX_ITEMS_FRUITS)) 
self.treeview.setItemDelegateForColumn(COLUMN_B, ComboBoxDelegate(COMBOBOX_ITEMS_COLORS)) 

後,我的應用程序崩潰,但被拋出沒有任何錯誤:

self.model_source = treeview_model 
self.sf_proxy_model.setSourceModel(self.model_source) 

看來,當使用sortfilterproxymodel來處理源模型時,我只能使用一個setItemDelegateForColumn

ComboBoxDelegate定義如下:

class ComboBoxDelegate(QStyledItemDelegate): 
    def __init__(self, items): 
     super(ComboBoxDelegate, self).__init__() 

     self.items = items 

    def createEditor(self, parent, option, index): 
     editor = QComboBox(parent) 
     editor.setAutoFillBackground(True) 

     for item in self.items: 
      editor.addItem(item) 

     return editor 

    def setEditorData(self, editor, index): 
     current_index = editor.findText(index.model().data(index), Qt.MatchExactly) 
     editor.setCurrentIndex(current_index) 

    def setModelData(self, editor, model, index): 
     item_index = model.mapToSource(index) 
     item = model.sourceModel().item(item_index.row(), 0) 

     if index.parent().row() == -1 and item.hasChildren(): 
      for row in range(item.rowCount()): 
       child = item.child(row, 3) 
       child.setText(editor.currentText()) 

     model.setData(index, editor.currentText()) 

    def updateEditorGeometry(self, editor, option, index): 
     editor.setGeometry(option.rect) 

回答

1

樹形視圖不採取委託的所有權,所以你必須保持對它的引用自己(否則會被垃圾收集蟒蛇):

self.delegate1 = ComboBoxDelegate(COMBOBOX_ITEMS_FRUITS) 
    self.delegate2 = ComboBoxDelegate(COMBOBOX_ITEMS_COLORS) 
    self.view.setItemDelegateForColumn(COLUMN_A, self.delegate1) 
    self.view.setItemDelegateForColumn(COLUMN_B, self.delegate2) 
相關問題