到目前为止我做了什么:
我正在实现包含可编辑单元格的自定义QAbstractTableModel
(在QTableView
- 小部件中使用)。这些单元格的属性在我的flags()
方法中指定,如下所示:
def flags(self, index): # Qt was imported from PyQt4.QtCore
if index.column() < 2:
return Qt.ItemIsEditable | Qt.ItemIsEnabled | \
Qt.ItemIsSelectable
else:
return Qt.ItemIsEnabled | Qt.ItemIsSelectable
前两列中的单元格被标记为可编辑,就像我想要的那样。
我想做什么:
但是,当双击单元格以触发编辑时,将删除包含的文本并显示空字段。
但我不想删除&amp;替换包含的文本,因为包含的文本可能很长,不应重新输入。我只想编辑已经包含的内容。双击时,单元格应该可以使用之前包含的文本进行编辑(可能已经选中)。
问题:
我该如何实现这种行为?我是否需要编辑flags方法并为这些单元格指定不同的属性?
答案 0 :(得分:3)
您有几个选择。
在编辑过程中,单元格中没有数据出现,因为您可能没有为模型中的每个项目Qt.EditRole
设置任何数据。 QTableWidget
这样做是默认的。
另一种方法是使用QItemDelegate
。这将允许您手动创建编辑器窗口小部件并在它出现在QTableView
之前对其进行初始化。如果尚未填充编辑文本,则可以使用显示角色文本。
class MyDelegate(QtGui.QItemDelegate):
def createEditor(self, parent, option, index):
if index.column() == 2:
return super(MyDelegate, self).createEditor(parent, option, index)
return None
def setEditorData(self, editor, index):
if index.column() == 2:
# Gets display text if edit data hasn't been set.
text = index.data(Qt.EditRole) or index.data(Qt.DisplayRole)
editor.setText(text)
delegate = MyDelegate()
tableview.setItemDelegate(delegate)
答案 1 :(得分:1)
如布伦丹·阿贝尔所说,
在编辑期间,单元格中没有数据出现,因为您可能没有在模型中的每个项目的
Qt.EditRole
上设置任何数据
在这种情况下,要在双击单元格后在编辑框中显示以前的数据,它需要以data()
的身份访问EditRole
,因此您应该在中实现data()
方法继承的模型类是这样的:
def data(self, index, role=None):
...
if role == QtCore.Qt.DisplayRole or role == QtCore.Qt.EditRole:
item = index.internalPointer()
return item.data[index.column()]
...
中也提到了