2011-05-11 38 views
2

我正在使用自定義委託在我的QTableView中顯示組合框的列。重新排序時,自定義委託沒有遵循QTableView

除了默認選擇問題(enter link description here)之外,當我重新排序QTableView的數據(每列或應用過濾器)時,我遇到問題。當網格不顯示時,comboxes會保留在原來的位置。

有沒有辦法強制重繪委託?我複製paint方法的代碼(沒有索引),但這隻會導致我的程序崩潰。

讓我知道如果我不夠清楚。

這裏是我的自定義委託的代碼:

class ComboBoxDelegate(QtGui.QItemDelegate): 

    def __init__(self, parent, itemslist): 
     QtGui.QItemDelegate.__init__(self, parent) 
     self.itemslist = itemslist 
     self.parent = parent 

    def paint(self, painter, option, index):   
     # Get Item Data 
     value = index.data(QtCore.Qt.DisplayRole).toInt()[0] 
     # value = self.itemslist[index.data(QtCore.Qt.DisplayRole).toInt()[0]] 
     # fill style options with item data 
     style = QtGui.QApplication.style() 
     opt = QtGui.QStyleOptionComboBox() 
     opt.currentText = str(self.itemslist[value]) 
     opt.rect = option.rect 


     # draw item data as ComboBox 
     style.drawComplexControl(QtGui.QStyle.CC_ComboBox, opt, painter) 
     self.parent.openPersistentEditor(index) 

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

     ##get the "check" value of the row 
     # for row in range(self.parent.model.rowCount(self.parent)): 
      # print row 

     self.editor = QtGui.QComboBox(parent) 
     self.editor.addItems(self.itemslist) 
     self.editor.setCurrentIndex(0) 
     self.editor.installEventFilter(self)  
     self.connect(self.editor, QtCore.SIGNAL("currentIndexChanged(int)"), self.editorChanged) 

     return self.editor 

    # def setEditorData(self, editor, index): 
     # value = index.data(QtCore.Qt.DisplayRole).toInt()[0] 
     # editor.setCurrentIndex(value) 

    def setEditorData(self, editor, index): 
     text = self.itemslist[index.data(QtCore.Qt.DisplayRole).toInt()[0]] 
     pos = self.editor.findText(text) 
     if pos == -1: 
      pos = 0 
     self.editor.setCurrentIndex(pos) 


    def setModelData(self,editor,model,index): 
     value = self.editor.currentIndex() 
     model.setData(index, QtCore.QVariant(value)) 


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

    def editorChanged(self, index): 
     check = self.editor.itemText(index) 
     id_seq = self.parent.selectedIndexes[0][0] 
     update.updateCheckSeq(self.parent.db, id_seq, check) 


    def updateDelegate(self, indexRow, indewCol): 
     # index = self.parent.model.createIndex(indexRow, indewCol) 

     seq_id = self.parent.model.arraydata[indexRow][0] 
     print seq_id 
     check = select.getCheck(self.parent.db, seq_id) 
     check = check[0][0] 
     print check 
     if check != '': 
      pos = self.checkDict[check] 
     else: 
      pos = 0 
     self.editor.setCurrentIndex(pos) 

而且我把它從我的QTableView中類:

self.setEditTriggers(QtGui.QAbstractItemView.CurrentChanged) 
    self.viewport().installEventFilter(self) 
    self.delegate = ComboBoxDelegate(self, self.checkValues) 
    self.setItemDelegateForColumn(13,self.delegate) 

我稱之爲updateDelegate功能時,我排序的列(從模型類):

def sort(self, Ncol, order): 
     self.emit(QtCore.SIGNAL("layoutAboutToBeChanged()")) 
     self.arraydata = sorted(self.arraydata, key=operator.itemgetter(Ncol)) 
     i = 0 
     for row in self.arraydata: 
      self.parent.delegate.updateDelegate(i, 13) 
      i += 1 
     if order == QtCore.Qt.DescendingOrder: 
      self.arraydata.reverse() 
     self.emit(QtCore.SIGNAL("layoutChanged()")) 

回答

4

我需要調用QItemDelegate.paint()方法在我的自定義的paint()方法。希望它可以幫助某人。