我好几天都遇到了问题。我正在使用QTableView来显示模型中的数据。当用户单击一个单元格时,我激活了完整的行选择,使界面用户友好: self.tableau.selectRow(element.row())
但是,当用户按下F2时,我只想编辑第1列。因此,预期的行为是:
但是通过完整的行选择,F2无法知道选择了哪个单元格。所以,我重新实现了事件处理程序:
def keyPressEvent(self, e):
"""It reimplements event management in this method """
# TODO: find a way to re-select the cell after editing
# We get the name of current file
nom_courant = self.tableau.model().index(self.row_selected, 1).data()
print(nom_courant)
if e.key() == QtCore.Qt.Key_F2:
try:
# We edit the cell name of the selected line
#http://stackoverflow.com/questions/8157688/specifying-an-index-in-qtableview-with-pyqt
self.tableau.edit(self.tableau.model().index(self.row_selected, 1))
except:
print("Pas de cell sélectionnée")
pass
# It retrieves the new file name. CAN NOT do in the
# if the model is not updated yet.
nouveau_nom = self.tableau.model().index(self.row_selected, 1).data()
print(nouveau_nom)
# Call the fct renaming only if the name has changed
if nom_courant != nouveau_nom:
#liste.renameFile(self.current_video, self.tableau.model().index(self.row_selected, 1).data())
print("entropie")
现在的问题是这一行:
self.tableau.edit(self.tableau.model().index(self.row_selected, 1))
我无法检测生成的QLineEdit版本的结尾,我需要它来对编辑的单元格的新内容执行操作,因为如果没有键盘事件发生,则不会更新nouveau_nom。
您对如何获得最终版本信号有所了解吗?
(请原谅我的英语,我是法国人......)
答案 0 :(得分:1)
首先,您不需要实际拦截并将单元格选择更改为行选择。你可以在视图上set the behavior:
self.tableau.setSelectionBehavior(self.tableau.SelectRows)
这将自动选择行。
当您在表中使用自定义QLineEdit小部件时,您需要将QLineEdit.editingFinished()连接到您想要的任何处理程序。您很可能希望它在您的模型上调用dataChanged
。