【问题标题】:Undo functionality for QPainter drawEllipse() functionQPainter drawEllipse() 函数的撤消功能
【发布时间】:2018-11-23 21:11:42
【问题描述】:

我是 PyQt 的新手,开始使用一些在线代码。 QPainter 类中的 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 的按键,这个绘制的圆圈应该会消失,这可能吗?

【问题讨论】:

    标签: python-3.x pyqt qpainter


    【解决方案1】:

    我不明白你为什么使用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_())
    

    【讨论】:

    • 谢谢!刚开始我不知道有什么区别。
    猜你喜欢
    • 2014-03-18
    • 1970-01-01
    • 1970-01-01
    • 2021-08-05
    • 2018-04-23
    • 2013-10-03
    • 2011-08-07
    • 2016-02-28
    • 1970-01-01
    相关资源
    最近更新 更多