PySide QTableView多个单元格的setData

2024-06-26 14:22:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用的是QTableView,子类是QAbstractTableModel。编辑单元格时,我注意到QAbstractTableModel.setData只经过最后一个选定的单元格。有没有办法让setData与多个(选定的)细胞协同工作?在

作为使用示例:

  • 从表中选择四个单元格。在
  • 开始编辑一个单元格。在
  • 输入一个值,然后按enter键提交。在
  • 让值修改所有四个单元格(当前只修改最后选定的单元格)

我尝试对closeEditor进行子分类,然后循环使用selectedIndexes调用它们,但我不知道如何从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)

Tags: self编辑inputindexifisvalueeditor
2条回答

closeEditor信号中的editor是用于编辑的小部件。在

如果是这样的话,例如QLineEdit你可以通过它的text属性来读取它的文本。在

检索属性值的一种方法是通过QObject的property API

value = editor.property("text")

编辑:我把它作为一种解决方法,因为PySide中有一个bug,editor只返回一个QWidget。请看凯文·克拉默的回答!

虽然这只是一个小小的工作,但到目前为止,我的解决方案似乎运行良好。如果有更好的办法请告诉我,这有点冗长。在

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

相关问题 更多 >