2

我正在使用自定义委托在 QTableView 中显示一列组合框。

除了默认选择问题(在此处输入链接描述)我在重新排序 QTableView 的数据(每列或通过应用过滤器)时遇到问题。未显示网格时,组合框保持在原来的位置。

有没有办法强制重新绘制代表?我复制了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

1 回答 1

6

我需要在我的自定义 paint() 方法中调用 QItemDelegate.paint() 方法。希望它可以帮助某人。

于 2011-05-12T17:21:31.233 回答