QPainter drawEllipse() 函数的撤消功能

Undo functionality for QPainter drawEllipse() function

我是 PyQt 的新手,开始玩弄一些在线代码。 QPainter class 中的 drawEllipse() 函数根据定义的参数绘制椭圆。我的问题是,一旦我们调用该函数并将其绘制在我们的场景中,我该如何撤消此操作?文档中好像没有这样的函数可以做到这一点。

示例绘图代码:

def draw(self, x, y):
        painter = QPainter()
        painter.begin(self.image)
        painter.setPen(QPen(Qt.red, 5, Qt.SolidLine))
        painter.drawEllipse(QPoint(y,x),10,10)
        painter.end()
        self.scene.addPixmap(QPixmap.fromImage(self.image))

因此,如果按下 Ctrl+Z 键,绘制的圆应该会消失,这可能吗?

我不明白你为什么使用 QImage 因为如果你想画圆圈你应该使用 QGraphicsEllipseItem.

要实现撤消方法,我们必须将项目存储在列表中,然后当您调用撤消方法时,您将获得最后一个元素并使用 removeItem()QGraphicsScene 中删除它。

在下面的示例中,每次单击都会添加一个圆圈。

import sys

from PyQt5 import QtCore, QtGui, QtWidgets

class Widget(QtWidgets.QWidget):
    def __init__(self, parent=None):
        QtWidgets.QWidget.__init__(self, parent)
        lay = QtWidgets.QVBoxLayout(self)
        self.gv = QtWidgets.QGraphicsView()
        lay.addWidget(self.gv)
        self.scene = QtWidgets.QGraphicsScene(0, 0, 400, 400)
        self.gv.setScene(self.scene)
        self.gv.installEventFilter(self)

        self.items = []

        shortcut = QtWidgets.QShortcut(QtGui.QKeySequence("Ctrl+Z"), self)
        shortcut.activated.connect(self.undo)

    def eventFilter(self, obj, event):
        if obj == self.gv and event.type() == QtCore.QEvent.MouseButtonPress:
            p = self.gv.mapToScene(event.pos())
            self.draw(p)
        return QtWidgets.QWidget.eventFilter(self, obj, event)

    def draw(self, p):
        it = QtWidgets.QGraphicsEllipseItem(0, 0, 10, 10)
        it.setPen(QtGui.QPen(QtCore.Qt.red, 5, QtCore.Qt.SolidLine))
        self.scene.addItem(it)
        it.setPos(p)
        self.items.append(it)

    def undo(self):
        if self.items:
            it = self.items.pop()
            self.scene.removeItem(it)
            del it


if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    w = Widget()
    w.show()
    sys.exit(app.exec_())