在PyQt QAbstractTableModel中编辑表而不删除内容

时间:2016-05-31 14:42:31

标签: python pyqt4 qabstracttablemodel

到目前为止我做了什么:

我正在实现包含可编辑单元格的自定义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

前两列中的单元格被标记为可编辑,就像我想要的那样。

我想做什么:

但是,当双击单元格以触发编辑时,将删除包含的文本并显示空字段。

Example of editing a cell

但我不想删除&amp;替换包含的文本,因为包含的文本可能很长,不应重新输入。我只想编辑已经包含的内容。双击时,单元格应该可以使用之前包含的文本进行编辑(可能已经选中)。

问题:

我该如何实现这种行为?我是否需要编辑flags方法并为这些单元格指定不同的属性?

2 个答案:

答案 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()]
    ...

official document of model view programming

中也提到了