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,猜对了。
我第一次在 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,猜对了。