Изменение координат точки вместе с увеличением масштаба изображения 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_())

местонахождение точки до изменения масштаба

местонахождение после изменения масштаба


Ответы (0 шт):