Как анимировать отрисованные в QPainter объекты?
Не могу разобраться, как добавить анимацию к уже отрисованным объектам в QPainter
.
Есть одно условие, новые объекты могут добавляться в любое время и их перемещения тоже должны быть анимированы.
Пробовал реализовать этот пример, но он не подходит для динамического изменения количества объектов.
from PyQt5.QtWidgets import QWidget, QApplication
from PyQt5.QtCore import pyqtSignal, QRect, QPoint, Qt, QThread
from PyQt5 import QtGui
import time
import random
import queue
class MyThread(QThread):
task_update_coord = pyqtSignal(QPoint, int, name = "updateCoordinate")
def __init__(self, queue, parent=None):
super().__init__(parent)
self.x = 0
self.y = 0
self.queue = queue
def run(self):
while True:
self.x = random.randint(20, 200)
self.y = random.randint(20, 200)
self.id = random.randint(1, 2)
self.task_update_coord.emit(QPoint(self.x, self.y), self.id)
self.queue.put((self.x, self.y, self.id))
time.sleep(1)
print((self.x, self.y, self.id))
class Dialog(QWidget):
def __init__(self):
super().__init__()
self.queue = queue.Queue()
thread = MyThread(self.queue, parent=self)
self.setFixedSize(600, 600)
self.rect = QRect(0, 0, 10, 10)
self.rect2 = QRect(0, 0, 10, 10)
self.point = QPoint(10, 20)
self.child = QWidget()
thread.task_update_coord.connect(self.changing_coords, Qt.ConnectionType.QueuedConnection)
thread.start()
def changing_coords(self):
msg = self.queue.get()
print(msg)
x = msg[0]
y = msg[1]
id = msg[2]
self.rect = QRect(x, y, 30, 30)
self.rect2 = QRect(x+30, y+30, 30, 30)
self.update()
def paintEvent(self, event):
painter = QtGui.QPainter(self)
painter.drawEllipse(self.rect)
painter.drawText(self.rect, Qt.TextFlag.TextDontClip|Qt.AlignmentFlag.AlignCenter, str(1))
painter.drawEllipse(self.rect2)
painter.drawText(self.rect2, Qt.TextFlag.TextDontClip|Qt.AlignmentFlag.AlignCenter, str(2))
if __name__ == "__main__":
import sys
app = QApplication(sys.argv)
w = Dialog()
w.show()
sys.exit(app.exec_())
Источник: Stack Overflow на русском