Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python PySide QTableView多个单元格的设置数据_Python_Qt_Pyside_Qtableview_Qabstracttablemodel - Fatal编程技术网

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
)。