Изменение координат точки вместе с увеличением масштаба изображения PyQt5

Рейтинг: 1Ответов: 0Опубликовано: 11.04.2023

Не могу разобраться, как сохранять местоположение точки на экране при увеличении масштаба изображения (схема объекта, по координатам которой передвигаются точки).

При увеличении виджета увеличивается также сама схема (.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_())

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

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

Ответы

Ответов пока нет.