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_())
我是 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_())