我第一次搞乱PyQt中的表格,并且在编辑单元格值时遇到了一些意想不到的行为。
具体来说,当我输入数据时,它会显示在现有单元格数据的顶部(因此,如果单元格最初有' 123'在其中,我键入' 456',I最终得到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"
然而,一旦我尝试编辑单元格值,就会出现Segmentation故障。将print语句作为createWidget语句的第一行显示它不会执行 - createWidget中的一些print语句显示即使在createWidget的第一行执行之前发生了Segmentation错误(尽管__ init __方法完成正常)
Ceppo还说,我遇到的行为可能是由于一个错误(在Qt,PyQt或其他底层) - 我将很快用16.04替换我当前的Ubuntu 15.10安装好运将完全解决问题。
答案 0 :(得分:0)
将ubuntu 15.10升级到16.04确实解决了这个问题。
我的16.04发行版有python3-pyqt5和其他qt软件包,版本都在5.5.1左右 - 我确实检查了但是没想到在擦除它之前记下我的15.10安装中的那些软件包的版本 - 但是packages.ubuntu .com说5.4.2是15.10的当前版本,听起来很熟悉。
因此,如果QT 5.4.2的任何其他人遇到同样的事情,升级到5.5.1可能值得一试 - 升级到较新的发行版或尝试查找和使用较新的QT版本的后端口
感谢Ceppo93,这是一个很好的猜测。