我是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的击键,这个绘制的圆圈就会消失,这有可能吗?
发布于 2018-06-14 07:41:46
我不明白为什么要使用QImage,因为如果您想要绘制圆圈,就应该使用QGraphicsEllipseItem。
要实现undo方法,我们必须将项存储在列表中,然后在调用undo方法时获取最后一个元素并使用QGraphicsScene使用removeItem()将其删除。
在下面的示例中,每次单击时都会添加一个圆圈。
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_())https://stackoverflow.com/questions/50851587
复制相似问题