您使用的
paint方法不正确。当您要更改视图的显示行为时,应使用它。每次要绘制时也创建新的小部件非常昂贵。但是您想更改编辑行为,因此需要更改程序的整个逻辑。
请参阅固定代码。下面我将解释这些更改。
1.首先,我们需要使第一列可编辑。您可以通过重新实现
QAbstractItemModel::flags:
def flags(self, index): if (index.column() == 0): return QtCore.Qt.ItemIsEditable | QtCore.Qt.ItemIsEnabled else: return QtCore.Qt.ItemIsEnabled
2.默认情况下,当用户执行双击项目时,将创建项目编辑器。如果要默认显示所有组合框,则可以使用
openPersistentEditor:
for row in range(0, self._tm.rowCount()): self._tv.openPersistentEditor(self._tm.index(row, 0))
请注意,您还应该打开新创建的单元格的编辑器(如果有)。
3.现在回到我们的代表。我们需要实现
createEditor一种方法,该方法将在为单元格请求编辑器时由视图自动调用:
def createEditor(self, parent, option, index): combo = QtGui.QComboBox(parent) li = [] li.append("Zero") li.append("One") li.append("Two") li.append("Three") li.append("Four") li.append("Five") combo.addItems(li) self.connect(combo, QtCore.SIGNAL("currentIndexChanged(int)"), self, QtCore.SLOT("currentIndexChanged()")) return combo请注意,该
connect值低于
appends,因为我们需要避免
currentIndexChanged在初始化时发出信号。
4.``setEditorData更改模型数据后,视图将调用的Implement方法。初始化编辑器时,也会调用一次。
def setEditorData(self, editor, index): editor.blockSignals(True) editor.setCurrentIndex(int(index.model().data(index))) editor.blockSignals(False)
再次,我们要避免不是由用户引起的信号,因此我们使用
blockSignals。
5.在插槽中,我们只是发出
commitData信号,这将导致视图调用
setModelData我们的委托的:
@QtCore.pyqtSlot()def currentIndexChanged(self): self.commitData.emit(self.sender())
6.实现
setModelData方法:
def setModelData(self, editor, model, index): model.setData(index, editor.currentIndex())
7.您的模型需要支持数据更改。因此,我们应该实现
setData模型的方法:
def setData(self, index, value, role=QtCore.Qt.DisplayRole): print "setData", index.row(), index.column(), value # todo: remember the data



