无法保存Qt绘图的状态

时间:2018-11-04 20:20:23

标签: python python-3.x pyqt pyqt5

也许对Qt或Python的了解不足,甚至对这两者都不了解,但我对Python中的Qt5还是有疑问。

我有一个脚本,可以从按下鼠标指针的点到释放它的点画一条线。很好。

然后,当我想绘制第二行时,我也希望将第一行也保留在QDialog上,但是因为paintEvent的工作方式不可能立即实现。

为此,我创建了一个帮助器类(起初是在MyDialog类本身中),以将所有点存储在列表中,然后在paintEvent重绘QDialog时使用此类重绘所有行。

但是,这不起作用,因为由于某种原因,存储在帮助器类中的所有点都被最后一点覆盖。因此,如果我绘制十条线,则助手类的列表中的最后一个(第10个)点是其10倍。

在下面您可以看到代码,有人可以对此进行说明吗?谢谢!

import sys
from PyQt5.QtWidgets import QDialog, QApplication
from PyQt5.QtGui import QPainter, QPicture
from demoDrawLine import *

class ContextTest:
    test = []

class MyForm(QDialog):
    picture = []

    def __init__(self):
        super().__init__()
        self.drawing = []
        self.ui = Ui_Dialog()
        self.ui.setupUi(self)
        self.pos1 = [0,0]
        self.pos2 = [0,0]
        self.show()

    def paintEvent(self, event):
        super().paintEvent(event)
        qp = QPainter()
        qp.begin(self)
        qp.drawLine(self.pos1[0], self.pos1[1], self.pos2[0], self.pos2[1])
        qp.end()

    def mousePressEvent(self, event):
        if event.buttons() & QtCore.Qt.LeftButton:
            self.pos1[0], self.pos1[1] = event.pos().x(), event.pos().y()

    def mouseReleaseEvent(self, event):
        self.pos2[0], self.pos2[1] = event.pos().x(), event.pos().y()
        ContextTest.test.append((self.pos1, self.pos2))
        self.update()

if __name__ == "__main__":
    app = QApplication(sys.argv)
    w = MyForm()
    w.show()
    sys.exit(app.exec_())

这是我从调试器复制的一些结果:

绘制的第一行:ContextTest.test:[([[150,335],[452,618])]
画出第二行:ContextTest.test:[[[[311,695],[340,666]),([311,695],[340,666])]
画出的第三行:ContextTest.test:[[[[1444,249],[1043,712]),([1444,249],[1043,712]),([[1444,249],[1043,712]) ]
等等...

1 个答案:

答案 0 :(得分:2)

您正在保存测试中的点,但未将其用于绘制,因为您意识到paintEvent没有过去的概念,因此您必须保存这些点,但是比保存点更好的是保留知道如何操作的指令例如,它可以添加其他图形而无需在其中编写很多代码。

import sys
from PyQt5 import QtCore, QtGui, QtWidgets

class Instruction:
    def paint(self, painter):
        raise NotImplementedError()

class LineInstruction(Instruction):
    def __init__(self, line):
        self._line = line
    def paint(self, painter):
        painter.drawLine(self._line)

class ContextTest:
    instructions = []

class MyForm(QtWidgets.QDialog):
    def __init__(self):
        super().__init__()
        self.drawing = []
        self.show()

    def paintEvent(self, event):
        super().paintEvent(event)
        qp = QtGui.QPainter(self)
        for instruction in ContextTest.instructions:
            instruction.paint(qp)

    def mousePressEvent(self, event):
        if event.buttons() & QtCore.Qt.LeftButton:
            self.start = event.pos()

    def mouseReleaseEvent(self, event):
        l = QtCore.QLine(self.start, event.pos())
        instruction = LineInstruction(l)
        ContextTest.instructions.append(instruction)
        self.update()

if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    w = MyForm()
    w.show()
    sys.exit(app.exec_())