2017-10-14 199 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) 
相关问题