PyQt5 QTableView单元格编辑行为——原始值的叠加

PyQt5 QTableView cell editing behaviour - superimposition of original value

我第一次在 PyQt 中使用 tables,并且在编辑单元格值时 运行 遇到一些意外行为。

特别是当我键入数据时,它会出现在现有单元格数据的顶部(因此,如果单元格中最初包含“123”,而我键入“456”,我最终会得到 2 批 3 个字符,一个在另一个之上 - 至少在我按下 enter 键之前)。

需要说明的是,我对将更改写入模型的 setData 没有任何问题,或者在编辑完成后将更改反映在 table 中 - 一切都很好。唯一的问题是看到原始值和我输入的新值占用相同的 space 直到编辑完成。

所以大概我想做的是改变我现有的数据方法:

def data(self, index, int_role=None):
    row = index.row()
    column = index.column()
    if int_role == QtCore.Qt.DisplayRole:
        return str(self._data[row][column])
    elif int_role == QtCore.Qt.EditRole:
        return str(self._data[row][column])
    else:
        return None

以便它以某种方式识别被要求为其提供数据的单元格(在 DisplayRole 模式下)当前是否正在编辑,如果是,return 一个空字符串而不是实际数据(作为代码的 EditRole 分支也同时被调用,并愉快地处理显示任务,直到编辑完成。

我查看了 QT 文档,但不知道如何执行此操作。

编辑:在 ceppo 的评论之后,我考虑过创建一个新的 ItemDelegate - 但 looking into it further 看起来我可以改为切换现有的 itemEditorFactory - 特别是我添加了以下内容我的代码:

newEditor = QLineEdit()
newEditor.setAutoFillBackground(True)
ief = QItemEditorFactory()
ief.registerEditor(QVariant.String, LineEditorCreator())
tableView.itemDelegate().setItemEditorFactory(ief)

使用 LineEditorCreator 定义如下:

class LineEditCreator(QItemEditorCreatorBase):
    def __init__(self):
        QItemEditorCreatorBase.__init__(self)

    def createWidget(self, parent):
        wdgt = QLineEdit(parent)
        wdgt.setAutoFillBackground(True)
        return wdgt

    def valuePropertyName(self):
        return "String"

但是现在我在尝试编辑单元格值时立即遇到分段错误。将打印语句作为 createWidget 语句的第一行显示它从未执行过 - createWidget 中的一些打印语句显示分段错误甚至在 createWidget 的第一行执行之前就发生了(尽管 __ init __ 方法完成得很好) .

Ceppo 还说我遇到的行为可能是由于一个错误(在 Qt、PyQt 或其他潜在的东西中)——我很快就会用 16.04 替换我当前的 Ubuntu 15.10 安装运气好的话可以完全解决问题。

将 ubuntu 15.10 升级到 16.04 确实解决了问题。

我的 16.04 发行版有 python3-pyqt5 和其他版本都在 5.5.1 左右的 qt 包 - 我确实检查过但没想到在擦除之前在我的 15.10 安装中记下这些包的版本它 - 但 packages.ubuntu.com 说 5.4.2 是 15.10 的当前版本,这听起来很熟悉。

因此,如果使用 QT 5.4.2 的其他人 运行 遇到同样的问题,则升级到 5.5.1 可能值得一试 - 通过升级到更新的发行版或尝试查找和使用较新 QT 版本的反向移植。

感谢Ceppo93,猜对了。