Python PySide QTableView多个单元格的设置数据
我使用的是Python PySide QTableView多个单元格的设置数据,python,qt,pyside,qtableview,qabstracttablemodel,Python,Qt,Pyside,Qtableview,Qabstracttablemodel,我使用的是QTableView和子类QAbstractTableModel。编辑单元格时,我注意到QAbstractTableModel.setData仅通过最后选定的单元格。是否有方法获取setData以处理多个(选定)单元格 作为用法示例: 从表中选择四个单元格 开始编辑一个单元格 输入一个值并按enter键提交 让值修改所有四个单元格(当前仅修改最后选定的单元格) 我尝试对closeEditor进行子分类,然后通过selectedIndex循环调用setData,但我不知道如何从clo
QTableView
和子类QAbstractTableModel
。编辑单元格时,我注意到QAbstractTableModel.setData
仅通过最后选定的单元格。是否有方法获取setData
以处理多个(选定)单元格
作为用法示例:
- 从表中选择四个单元格
- 开始编辑一个单元格
- 输入一个值并按enter键提交
- 让值修改所有四个单元格(当前仅修改最后选定的单元格)
closeEditor
进行子分类,然后通过selectedIndex
循环调用setData
,但我不知道如何从closeEditor
获取用户的输入值
这是我的尝试,几乎成功了,只需要输入值
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")
Edit:我将此作为一种解决方法,因为PySide中有一个bug,
editor
只返回一个QWidget
。请看凯文·克拉默的回答强>
虽然这只是一个小小的解决方案,但到目前为止,我的解决方案似乎运行良好。如果有更好的办法,请告诉我,这有点冗长
在closeEditor
中,我让每个单元格通过setData
,并将None
作为值
然后在QAbstractTableModel
中,我在那里有一个变量\u input\u 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
编辑器是一个
QWidget
,因此没有文本属性。正如我所写的:如果小部件是QLineEdit
,那么它有一个文本属性。也就是说,它取决于哪个小部件被用作编辑器。默认代理对文本使用行编辑,对数字使用旋转框等等,然后使用哪一个?编辑器的类名是什么?也就是说,editor.metaObject().className()
?editor.metaObject().className()
的值是qexpandlineedit
。虽然type(editor)
是QWidget
,但我不能像你建议的那样调用editor.text,因为它不存在。值是否填充在editor().metaObject()中的某个地方?我查看了它的文档,但真的找不到办法。@GreenCell。这里给出的答案在技术上是正确的。qexpandlineedit
是一个内部Qt类,它是QLineEdit
的子类。PySide中似乎有一个bug,因为它应该将QLineEdit
的实例传递给closeEditor
,而不是QWidget
。同一代码在PyQt4中正常工作(即,它通过QLineEdit
)。