如何撤消QAbstractTableModel中的更改?

讨厌的

我有一个简单的示例:QAbstractTableModel的最后一列中的值等于第1列中的值乘以2。因此,每次对第1列中的值进行更改时,都会导致第2列中的更改。

当最后一列的值更改时,将显示一个消息框,询问用户是否希望确认操作。

假设用户在第1列中更改了值,并看到以下消息:如果希望单击“取消”(返回第1列和第2列中的两个旧值),我希望我的应用撤消更改,您能帮我吗?我需要定义我的'go_back()'函数:

class Mainwindow(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()

        self.table = QtWidgets.QTableView()
        self.setCentralWidget(self.table)

        self.data = [
            [1, 0.18, 0.36],
            [2, 0.25, 0.50],
            [3, 0.43, 0.86],
            ]

        self.model = MyModel(self.data)
        self.table.setModel(self.model)

        self.table.setSelectionBehavior(self.table.SelectRows)
        self.table.setSelectionMode(self.table.SingleSelection)

        self.model.dataChanged.connect(lambda index: self.count_last_column(index))
        self.model.dataChanged.connect(lambda index: self.if_last_column_changed(index))

    def calculations(self, position):
        value = self.model.list_data[position][1] * 2
        return value

    def count_last_column(self, index):
        if index.column() == 1:
            position = index.row()
            self.model.setData(self.model.index(position,2), self.calculations(position))

    def if_last_column_changed(self, index):
        if index.column() == 2:
            message_box, message_box_button = self.show_message_box()

            if message_box_button == 'Ok':
                pass
            elif message_box_button == 'Cancel':
                self.go_back()

    def show_message_box(self):
        self.message_box = QtWidgets.QMessageBox(QtWidgets.QMessageBox.Warning, 'Action', 'Value in column 3 has changed, confirm action?')

        self.message_box.Ok = self.message_box.addButton(QtWidgets.QMessageBox.Ok)
        self.message_box.Cancel = self.message_box.addButton(QtWidgets.QMessageBox.Cancel)

        self.message_box.exec()

        if self.message_box.clickedButton() == self.message_box.Ok:
            return (self.message_box, 'Ok')
        elif self.message_box.clickedButton() == self.message_box.Cancel:
            return (self.message_box, 'Cancel')

    def go_back(self):
        pass #################



class MyModel(QtCore.QAbstractTableModel):

    def __init__(self, list_data = [[]], parent = None):
        super(MyModel, self).__init__()
        self.list_data = list_data

    def rowCount(self, parent):
        return len(self.list_data)

    def columnCount(self, parent):
        return len(self.list_data[0])

    def data(self, index, role):

        if role == QtCore.Qt.DisplayRole:
            row = index.row()
            column = index.column()
            value = self.list_data[row][column]
            return value

        if role == QtCore.Qt.EditRole:
            row = index.row()
            column = index.column()
            value = self.list_data[row][column]
            return value


    def setData(self, index, value, role = QtCore.Qt.EditRole):

        if role == QtCore.Qt.EditRole:
            row = index.row()
            column = index.column()
            self.list_data[row][column] = value
            self.dataChanged.emit(index, index)
            return True

        return False

    def flags(self, index):
        return QtCore.Qt.ItemIsEditable | QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsUserCheckable


if __name__ == '__main__':

    app = QtWidgets.QApplication([])
    application = Mainwindow()
    application.show()


    sys.exit(app.exec())
亚历克

一种选择是将QUndoStack与项目模型一起使用,并将QUndoCommand对象推入中的堆栈setData这种方法的好处是,如果需要,可以轻松实现更多的撤消/重做控件。

在中MyModel,只需在构造函数中创建一个堆栈,并在修改列表数据之前添加一行以将命令推入堆栈(这样就可以将先前的值存储在命令中)。其余的类保持不变。

class MyModel(QtCore.QAbstractTableModel):

    def __init__(self, list_data = [[]], parent = None):
        super(MyModel, self).__init__()
        self.list_data = list_data
        self.stack = QtWidgets.QUndoStack()

    def setData(self, index, value, role = QtCore.Qt.EditRole):

        if role == QtCore.Qt.EditRole:
            row = index.row()
            column = index.column()
            
            self.stack.push(CellEdit(index, value, self))
            
            self.list_data[row][column] = value
            self.dataChanged.emit(index, index)
            return True

        return False

使用传递给构造函数的索引,值和模型创建QUndoCommand,以便可以通过调用undo或redo来修改所需的单元格。

class CellEdit(QtWidgets.QUndoCommand):

    def __init__(self, index, value, model, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.index = index
        self.value = value
        self.prev = model.list_data[index.row()][index.column()]
        self.model = model

    def undo(self):
        self.model.list_data[self.index.row()][self.index.column()] = self.prev

    def redo(self):
        self.model.list_data[self.index.row()][self.index.column()] = self.value

现在go_back,对于两个已修改的单元格,只需要做两次调用undo方法即可。

def go_back(self):
    self.model.stack.undo()
    self.model.stack.undo()

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何撤消.profile中的更改?

来自分类Dev

如何撤消放弃GitHub Desktop中的更改?

来自分类Dev

如何撤消任意提交中的更改?

来自分类Dev

如何撤消更改?

来自分类Dev

撤消python中的更改

来自分类Dev

在Git中多次提交后如何撤消文件中的更改?

来自分类Dev

Git:如何撤消某个文件夹中的暂存更改

来自分类Dev

如何撤消tortoisesvn中的“从此修订版本还原更改”

来自分类Dev

如何撤消命令历史记录中的更改?

来自分类Dev

如何撤消更改并在Winform中检索以前的表单状态?

来自分类Dev

如何撤消PATH更改?(CentOS的)

来自分类Dev

撤消mysql中的多个更改

来自分类Dev

在 Git 中撤消本地更改

来自分类Dev

在Visual Studio 2013和TFS中单击“撤消挂起的更改...”后,如何找回更改

来自分类Dev

如何还原/撤消对Activerecord对象的本地更改?

来自分类Dev

如何正常撤消对Ubuntu PATH变量的更改?

来自分类Dev

PyQt5更改QAbstractTableModel中的BackgroundRole设置

来自分类Dev

在vim中撤消/重做时,如何更改显示的时间戳格式?

来自分类Dev

如何撤消git中的最后一次提交,但使更改保持未登台状态?

来自分类Dev

如何在Ubuntu中通过npm完全撤消所有更改

来自分类Dev

如何撤消Synaptic软件包管理器中的更改

来自分类Dev

Git:如何撤消某个文件夹中未进行的暂存更改

来自分类Dev

如何在Github Desktop中“撤消”撤消操作?

来自分类Dev

如何在QAbstractTableModel中向右和垂直居中对齐?

来自分类Dev

如何在Linux中撤消DISPLAY导出?

来自分类Dev

如何在Mercurial中查找撤消提交?

来自分类Dev

如何在UIWebView中实现撤消/重做

来自分类Dev

如何撤消在git中恢复还原?

来自分类Dev

您如何撤消在Vim中设置选项?

Related 相关文章

  1. 1

    如何撤消.profile中的更改?

  2. 2

    如何撤消放弃GitHub Desktop中的更改?

  3. 3

    如何撤消任意提交中的更改?

  4. 4

    如何撤消更改?

  5. 5

    撤消python中的更改

  6. 6

    在Git中多次提交后如何撤消文件中的更改?

  7. 7

    Git:如何撤消某个文件夹中的暂存更改

  8. 8

    如何撤消tortoisesvn中的“从此修订版本还原更改”

  9. 9

    如何撤消命令历史记录中的更改?

  10. 10

    如何撤消更改并在Winform中检索以前的表单状态?

  11. 11

    如何撤消PATH更改?(CentOS的)

  12. 12

    撤消mysql中的多个更改

  13. 13

    在 Git 中撤消本地更改

  14. 14

    在Visual Studio 2013和TFS中单击“撤消挂起的更改...”后,如何找回更改

  15. 15

    如何还原/撤消对Activerecord对象的本地更改?

  16. 16

    如何正常撤消对Ubuntu PATH变量的更改?

  17. 17

    PyQt5更改QAbstractTableModel中的BackgroundRole设置

  18. 18

    在vim中撤消/重做时,如何更改显示的时间戳格式?

  19. 19

    如何撤消git中的最后一次提交,但使更改保持未登台状态?

  20. 20

    如何在Ubuntu中通过npm完全撤消所有更改

  21. 21

    如何撤消Synaptic软件包管理器中的更改

  22. 22

    Git:如何撤消某个文件夹中未进行的暂存更改

  23. 23

    如何在Github Desktop中“撤消”撤消操作?

  24. 24

    如何在QAbstractTableModel中向右和垂直居中对齐?

  25. 25

    如何在Linux中撤消DISPLAY导出?

  26. 26

    如何在Mercurial中查找撤消提交?

  27. 27

    如何在UIWebView中实现撤消/重做

  28. 28

    如何撤消在git中恢复还原?

  29. 29

    您如何撤消在Vim中设置选项?

热门标签

归档