在 PyQt QAbstractTableModel 中编辑 table 不删除内容
Edit table in PyQt QAbstractTableModel without deletion of content
到目前为止我做了什么:
我正在实施包含可编辑单元格的自定义 QAbstractTableModel
(用于 QTableView
-Widget)。这些单元格的属性在我的 flags()
方法中指定,如下所示:
def flags(self, index): # Qt was imported from PyQt4.QtCore
if index.column() < 2:
return Qt.ItemIsEditable | Qt.ItemIsEnabled | \
Qt.ItemIsSelectable
else:
return Qt.ItemIsEnabled | Qt.ItemIsSelectable
前两列中的单元格已按我的意愿标记为可编辑。
我想做的事情:
但是,当双击单元格以触发编辑时,包含的文本将被删除并显示一个空字段。
但我不想删除和替换包含的文本,因为包含的文本可能很长,不应该重新输入。我只想编辑已经包含的内容。双击时,单元格应该可以使用之前包含的文本(可能已经被选中)进行编辑。
问题:
我怎样才能实现这种行为?我是否需要编辑我的标志方法并为这些单元格指定不同的属性?
你有几个选择。
编辑期间单元格中未显示任何数据,因为您可能尚未在 Qt.EditRole
上为模型中的每个项目设置任何数据。 QTableWidget
默认这样做。
另一种方法是使用 QItemDelegate
。这将允许您手动创建编辑器小部件并在它出现在 QTableView
之前对其进行初始化。如果尚未填充编辑文本,您可以使用显示角色文本。
class MyDelegate(QtGui.QItemDelegate):
def createEditor(self, parent, option, index):
if index.column() == 2:
return super(MyDelegate, self).createEditor(parent, option, index)
return None
def setEditorData(self, editor, index):
if index.column() == 2:
# Gets display text if edit data hasn't been set.
text = index.data(Qt.EditRole) or index.data(Qt.DisplayRole)
editor.setText(text)
delegate = MyDelegate()
tableview.setItemDelegate(delegate)
正如 Brendan Abel 所说,
No data is appearing in the cells during editing because you likely haven't set any data on the Qt.EditRole
for each item in your model
在这种情况下,要在双击单元格后在编辑框中显示以前的数据,需要访问 data()
作为 EditRole
,因此您应该实现 data()
继承模型 class 中的方法如下所示:
def data(self, index, role=None):
...
if role == QtCore.Qt.DisplayRole or role == QtCore.Qt.EditRole:
item = index.internalPointer()
return item.data[index.column()]
...
中也提到了
到目前为止我做了什么:
我正在实施包含可编辑单元格的自定义 QAbstractTableModel
(用于 QTableView
-Widget)。这些单元格的属性在我的 flags()
方法中指定,如下所示:
def flags(self, index): # Qt was imported from PyQt4.QtCore
if index.column() < 2:
return Qt.ItemIsEditable | Qt.ItemIsEnabled | \
Qt.ItemIsSelectable
else:
return Qt.ItemIsEnabled | Qt.ItemIsSelectable
前两列中的单元格已按我的意愿标记为可编辑。
我想做的事情:
但是,当双击单元格以触发编辑时,包含的文本将被删除并显示一个空字段。
但我不想删除和替换包含的文本,因为包含的文本可能很长,不应该重新输入。我只想编辑已经包含的内容。双击时,单元格应该可以使用之前包含的文本(可能已经被选中)进行编辑。
问题:
我怎样才能实现这种行为?我是否需要编辑我的标志方法并为这些单元格指定不同的属性?
你有几个选择。
编辑期间单元格中未显示任何数据,因为您可能尚未在 Qt.EditRole
上为模型中的每个项目设置任何数据。 QTableWidget
默认这样做。
另一种方法是使用 QItemDelegate
。这将允许您手动创建编辑器小部件并在它出现在 QTableView
之前对其进行初始化。如果尚未填充编辑文本,您可以使用显示角色文本。
class MyDelegate(QtGui.QItemDelegate):
def createEditor(self, parent, option, index):
if index.column() == 2:
return super(MyDelegate, self).createEditor(parent, option, index)
return None
def setEditorData(self, editor, index):
if index.column() == 2:
# Gets display text if edit data hasn't been set.
text = index.data(Qt.EditRole) or index.data(Qt.DisplayRole)
editor.setText(text)
delegate = MyDelegate()
tableview.setItemDelegate(delegate)
正如 Brendan Abel 所说,
No data is appearing in the cells during editing because you likely haven't set any data on the
Qt.EditRole
for each item in your model
在这种情况下,要在双击单元格后在编辑框中显示以前的数据,需要访问 data()
作为 EditRole
,因此您应该实现 data()
继承模型 class 中的方法如下所示:
def data(self, index, role=None):
...
if role == QtCore.Qt.DisplayRole or role == QtCore.Qt.EditRole:
item = index.internalPointer()
return item.data[index.column()]
...
中也提到了