我第一次在PyQt中混淆了表格,并且在编辑单元格值时遇到了一些意外的行为。PyQt5 QTableView单元格编辑行为 - 原始值的叠加
具体来说,当我键入数据时,它会出现在现有单元格数据的顶部(所以如果单元格最初有'123',并且我输入'456',那么我最终会有2个3个字符,一个在另一个的顶部 - 至少直到我按下输入)。
要说清楚的是,我没有将setData写入模型的变化,或者在编辑完成后在表中反映出更改 - 这一切都很好。唯一的问题是看到我输入的原始值和新值占用相同的空间,直到编辑完成。
所以大概就是我想要做的是改变我现有的数据的方法:
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模式)数据的单元格目前正在修改,使得它在某种程度上承认,如果是这样,返回一个空字符串,而不是实际的数据(因为代码的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"
但是现在我只要我尝试编辑一个单元格的值出现段故障。将print语句作为createWidget语句的第一行显示它不会执行 - createWidget中的一些打印语句显示,即使在执行createWidget的第一行之前,Segmentation故障也会发生(尽管__ init __方法可以完成) 。我会遇到一个错误(在Qt,PyQt或其他基础上) - 我很快就会用16.04取代当前的Ubuntu 15.10,所以有些运气会完全解决问题。
编辑器背景可能存在一些问题,如果编辑器具有透明背景,尝试添加'BackgroundRole'并返回一个颜色(例如红色),则在编辑时会看到该颜色。 – Ceppo93
我在'int_role == QtCore.Qt.BackgroundRole'子句中添加了另一个elif分支,并在其中添加了'return QColor(255,0,0,255)' - 这确实将所有单元格的背景变为红色,所有的时间,无论它们是否被编辑 - 但这并没有真正帮助实现在编辑器可见时使单元格内容不可见的目标。我明白,如果我可以将编辑器的背景设置为窗口背景的颜色,但我不知道如何在EditRole分支中设置编辑器的背景颜色(或者如何引用编辑器)。 – Blair
这是找到问题的根源(可能是你的qt版本中的一个错误?我没有这个问题);)无论如何,你不能直接从模型中改变编辑器的背景,但你可以写一个简单的' LineEdit'编辑器委托,然后你可以在这里找到解决方案:http://stackoverflow.com/questions/22805756/make-item-delegate-in-qtableview-not-transparent/22806076 – Ceppo93