首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QPainter drawEllipse()函数的撤消功能

QPainter drawEllipse()函数的撤消功能
EN

Stack Overflow用户
提问于 2018-06-14 07:11:17
回答 1查看 849关注 0票数 1

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

示例绘图代码:

代码语言:javascript
复制
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的击键,这个绘制的圆圈就会消失,这有可能吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-14 07:41:46

我不明白为什么要使用QImage,因为如果您想要绘制圆圈,就应该使用QGraphicsEllipseItem

要实现undo方法,我们必须将项存储在列表中,然后在调用undo方法时获取最后一个元素并使用QGraphicsScene使用removeItem()将其删除。

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

代码语言:javascript
复制
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_())
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50851587

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档