Может недостаточно знаний Qt или Python, может даже и того и другого, но у меня проблема с Qt5 в Python.
У меня есть скрипт, который рисует линию от точки, где указатель мыши нажат, до точки, где он отпущен. Это прекрасно работает.
Затем, когда я хочу нарисовать вторую строку, я также хочу сохранить первую строку в 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_())
Вот некоторые результаты, которые я скопировал из отладчика:
1-я нарисованная строка: ContextTest.test : [([150, 335], [452, 618])]
2-я нарисованная строка: ContextTest.test : [([311, 695], [340, 666]), ( [311, 695], [340, 666])]
3-я строка: ContextTest.test : [([1444, 249], [1043, 712]), ([1444, 249], [1043, 712 ]), ([1444, 249], [1043, 712])]
и т. д.