也许对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]) ]
等等...
答案 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_())