撤消 QPainter drawEllipse() 函数的功能



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

示例绘图代码:

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.

要实现 undo 方法,我们必须将项目存储在列表中,然后当您调用 undo 方法时,您将获得最后一个元素并使用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_())

最新更新