多个单元格的 PySide QTableView setData
PySide QTableView setData for multiple cells
我正在使用 QTableView
并分类 QAbstractTableModel
。编辑单元格时,我注意到 QAbstractTableModel.setData
只经过最后一个选定的单元格。有没有办法让 setData
处理多个(选定的)单元格?
作为用法示例:
- Select 来自 table.
的四个单元格
- 开始编辑一个单元格。
- 输入一个值并按回车键提交。
- 修改所有四个单元格的值(目前它只修改最后选择的单元格)
我尝试对 closeEditor
进行子类化,然后通过 selectedIndexes
循环以使用 setData
调用它们,但我不知道如何从 [=] 获取用户的输入值15=].
这是我的尝试,差不多搞定了,只需要输入值。
def closeEditor(self, editor, hint):
is_cancelled = (hint == QtGui.QAbstractItemDelegate.RevertModelCache)
if not is_cancelled:
for index in self.selectedIndexes():
if index == self.currentIndex():
continue
input_value = ??? # Don't know how to get this from here!
self.model().setData(index, input_value, QtCore.Qt.EditRole)
return QtGui.QTableWidget.closeEditor(self, editor, hint)
closeEditor
信号中的 editor
是用于编辑的小部件。
如果是,例如 QLineEdit
您可以通过 text
属性.
阅读它的文本
检索 属性 值的一种方法是通过 QObject 的 属性 API
value = editor.property("text")
编辑:我将其用作解决方法,因为 PySide 中存在 editor
仅返回 QWidget
的错误。请看Kevin Krammer的回答!
虽然这是一个小的解决方法,但我目前的解决方案似乎运行良好。如果有更好的方法请告诉我,这个有点啰嗦。
在closeEditor
中,我让每个单元格都通过setData
,并以None
作为值。
然后在 QAbstractTableModel
我那里有一个变量 _input_value
它将存储用户的输入以供其余单元格获取。
class TableView(QtGui.QTableView):
def __init__(self, parent=None):
super(TableView, self).__init__(parent)
def closeEditor(self, editor, hint):
is_cancelled = (hint == QtGui.QAbstractItemDelegate.RevertModelCache)
if not is_cancelled:
for index in self.selectedIndexes():
if index == self.currentIndex():
continue
# Supply None as the value
self.model().setData(index, None, QtCore.Qt.EditRole)
# Reset value for next input
if self.model()._input_value is not None:
self.model()._input_value = None
return QtGui.QTableWidget.closeEditor(self, editor, hint)
class TableModel(QtCore.QAbstractTableModel):
def __init__(self, parent=None):
super(TableModel, self).__init__(parent)
self.main_widget = parent
self._input_value = None
def setData(self, index, value, role):
# Triggers if user cancelled input
if value is None and self._input_value is None:
return False
if self._input_value is None:
# The last selected cell will pass through here to store the value.
self._input_value = value
else:
# All other cells will pass None, so just grab our stored value.
value = self._input_value
# Do whatever you want with value now
return True
我正在使用 QTableView
并分类 QAbstractTableModel
。编辑单元格时,我注意到 QAbstractTableModel.setData
只经过最后一个选定的单元格。有没有办法让 setData
处理多个(选定的)单元格?
作为用法示例:
- Select 来自 table. 的四个单元格
- 开始编辑一个单元格。
- 输入一个值并按回车键提交。
- 修改所有四个单元格的值(目前它只修改最后选择的单元格)
我尝试对 closeEditor
进行子类化,然后通过 selectedIndexes
循环以使用 setData
调用它们,但我不知道如何从 [=] 获取用户的输入值15=].
这是我的尝试,差不多搞定了,只需要输入值。
def closeEditor(self, editor, hint):
is_cancelled = (hint == QtGui.QAbstractItemDelegate.RevertModelCache)
if not is_cancelled:
for index in self.selectedIndexes():
if index == self.currentIndex():
continue
input_value = ??? # Don't know how to get this from here!
self.model().setData(index, input_value, QtCore.Qt.EditRole)
return QtGui.QTableWidget.closeEditor(self, editor, hint)
closeEditor
信号中的 editor
是用于编辑的小部件。
如果是,例如 QLineEdit
您可以通过 text
属性.
检索 属性 值的一种方法是通过 QObject 的 属性 API
value = editor.property("text")
编辑:我将其用作解决方法,因为 PySide 中存在 editor
仅返回 QWidget
的错误。请看Kevin Krammer的回答!
虽然这是一个小的解决方法,但我目前的解决方案似乎运行良好。如果有更好的方法请告诉我,这个有点啰嗦。
在closeEditor
中,我让每个单元格都通过setData
,并以None
作为值。
然后在 QAbstractTableModel
我那里有一个变量 _input_value
它将存储用户的输入以供其余单元格获取。
class TableView(QtGui.QTableView):
def __init__(self, parent=None):
super(TableView, self).__init__(parent)
def closeEditor(self, editor, hint):
is_cancelled = (hint == QtGui.QAbstractItemDelegate.RevertModelCache)
if not is_cancelled:
for index in self.selectedIndexes():
if index == self.currentIndex():
continue
# Supply None as the value
self.model().setData(index, None, QtCore.Qt.EditRole)
# Reset value for next input
if self.model()._input_value is not None:
self.model()._input_value = None
return QtGui.QTableWidget.closeEditor(self, editor, hint)
class TableModel(QtCore.QAbstractTableModel):
def __init__(self, parent=None):
super(TableModel, self).__init__(parent)
self.main_widget = parent
self._input_value = None
def setData(self, index, value, role):
# Triggers if user cancelled input
if value is None and self._input_value is None:
return False
if self._input_value is None:
# The last selected cell will pass through here to store the value.
self._input_value = value
else:
# All other cells will pass None, so just grab our stored value.
value = self._input_value
# Do whatever you want with value now
return True