Изменение координат точки вместе с увеличением масштаба изображения PyQt5
Не могу разобраться, как сохранять местоположение точки на экране при увеличении масштаба изображения (схема объекта, по координатам которой передвигаются точки).
При увеличении виджета увеличивается также сама схема (.jpg-картинка), из-за чего точки остаются на старых координатах, а путь на схеме перемещается в другое место.
Также необходимо увеличивать точки пропорционально виджету и схеме.
from PyQt5.QtWidgets import QWidget, QApplication, QScrollArea, QPushButton
from PyQt5.QtCore import pyqtSignal, QRect, Qt, QThread, QTimer
from PyQt5 import QtGui
import random
import time
import queue
import math
ZONE_CAR = 100
class MyThread(QThread): #поток имитации координат
task_update_coord = pyqtSignal(int, name = "updateCoordinate")
def __init__(self, queue, dict_points, parent=None):
super().__init__(parent)
self.x = 0
self.y = 0
self.points = dict_points
self.queue = queue
def run(self):
try:
while True:
self.x = random.randint(100, 400)
self.y = random.randint(100, 400)
self.id = random.randint(1, 10)
if self.id != 1:
s = math.sqrt((self.points[1].x - self.x) ** 2 + (self.points[1].y - self.y) ** 2)
if s < ZONE_CAR:
self.points[self.id].x_v = self.x
self.points[self.id].y_v = self.y
self.points[self.id].rendered = True
self.task_update_coord.emit(self.id)
time.sleep(0.1)
elif s > ZONE_CAR and self.points.get(self.id):
self.points[self.id].rendered = False
self.task_update_coord.emit(self.id)
elif self.id == 1:
self.points[self.id].x_v = self.x
self.points[self.id].y_v = self.y
self.task_update_coord.emit(self.id)
time.sleep(0.1)
except Exception as ex:
print(ex)
class Dialog(QWidget):
def __init__(self):
super().__init__()
self.queue = queue.Queue()
self.main_id = 1
self.points = {}#временный словарь для хранения координат и айди точки
self._thread = MyThread(self.queue, self.points, parent=self)
self.background_pixmap = QtGui.QPixmap("background.jpg")
self.scaled_pixmap = self.background_pixmap
self.points[self.main_id] = CarPoint(0, 0, 0, 0, 1)
for _ in range(2, 11):
self.points[_] = CarPoint(0, 0, 0, 0, _)
self._thread.task_update_coord.connect(self.changing_coords_car_point, Qt.ConnectionType.QueuedConnection)
self._thread.start()
def changing_coords_car_point(self, id):
try:
while self.points[id].x != self.points[id].x_v and self.points[id].y != self.points[id].y_v:
if self.points[id].x < self.points[id].x_v:
self.points[id].x += 1
elif self.points[id].x > self.points[id].x_v:
self.points[id].x -= 1
else:
pass
if self.points[id].y < self.points[id].y_v:
self.points[id].y += 1
elif self.points[id].y > self.points[id].y_v:
self.points[id].y -= 1
else:
pass
self.update()
QApplication.processEvents()
except Exception as ex:
print(ex)
def resizeEvent(self, event):
try:
x = self.width()
y = self.height()
x_old = event.oldSize().width()
y_old = event.oldSize().height()
self.new_pixmap = self.background_pixmap.scaled(x, y, aspectRatioMode=Qt.AspectRatioMode.IgnoreAspectRatio, transformMode=Qt.TransformationMode.SmoothTransformation)
except Exception as ex:
print(ex)
def paintEvent(self, event):
try:
painter = QtGui.QPainter(self)
painter.drawPixmap(0, 0, self.new_pixmap)
painter.setBrush(QtGui.QBrush(QtGui.QColor("salmon")))
for _ in self.points.keys():
if self.points[_].rendered:
self.points[_].draw(painter)
except Exception as ex:
print(ex)
class CarPoint():
def __init__(self, x, y, x_v, y_v, id, rendered=True):
self.x = x
self.y = y
self.x_v = x_v
self.y_v = y_v
self.id = id
self.rendered = rendered
def draw(self, painter: QtGui.QPainter):
try:
painter.save()
self.rect = QRect(int(self.x), int(self.y), 20, 20)
painter.drawEllipse(self.rect)
painter.drawText(self.rect, Qt.TextFlag.TextDontClip|Qt.AlignmentFlag.AlignCenter, str(self.id))
painter.rotate(60)
painter.restore()
except Exception as ex:
print(ex)
if __name__ == "__main__":
import sys
app = QApplication(sys.argv)
w = Dialog()
w.show()
sys.exit(app.exec_())
Источник: Stack Overflow на русском