3

到目前为止我做了什么:

我正在实现一个包含可编辑单元格的自定义QAbstractTableModel(在-Widget 中使用)。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

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

我想做的事:

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

编辑单元格的示例

但我不想删除和替换包含的文本,因为包含的文本可能很长,不应该重新输入。我只想编辑已经包含的内容。双击时,单元格应可编辑,其中包含先前包含的文本(可能已选中)。

问题:

我怎样才能实现这种行为?我是否需要编辑我的标志方法并为这些单元格指定不同的属性?

4

2 回答 2

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)
于 2016-05-31T17:40:54.337 回答
2

正如布伦丹·阿贝尔所说,

编辑期间单元格中没有出现任何数据,因为您可能没有Qt.EditRole为模型中的每个项目设置任何数据

在这种情况下,双击单元格后要在编辑框中显示以前的数据,它需要访问data()as 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()]
    ...

模型视图编程的官方文档中也有提到

于 2020-02-21T01:39:02.793 回答