多个单元格的 PySide QTableView setData

PySide QTableView setData for multiple cells

我正在使用 QTableView 并分类 QAbstractTableModel。编辑单元格时,我注意到 QAbstractTableModel.setData 只经过最后一个选定的单元格。有没有办法让 setData 处理多个(选定的)单元格?

作为用法示例:

我尝试对 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