Логика c создания динамического c элемента должна указывать набор специфических c характеристик, которые, изменяя их, изменяют элемент.
В этом случае вы можете использовать центр квадрата, размеры квадрата, эт c. и эти данные должны быть реализованы через структуру данных, которая может быть создана с нуля, например, путем создания класса, который имеет информацию о прямоугольнике, но в Qt нет необходимости создавать этот элемент, поскольку он уже существует и является QRect.
Теперь, когда этот элемент был идентифицирован, вы можете создать QRect, верхний левый угол которого является случайным при нажатии кнопки, и использовать этот QRect, чтобы нарисовать его.
Для перетаскивания выполните следующую процедуру:
- Получите позицию щелчка мыши.
- Убедитесь, что щелчок находится внутри прямоугольника.
- Рассчитайте позицию относительно прямоугольника.
- При перемещении мыши положение прямоугольника должно обновляться в зависимости от положения нажатия мыши.
Учитывая все вышеперечисленное, решение:
import random
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
class Window(QtWidgets.QMainWindow):
def __init__(self):
super(Window, self).__init__()
self.rect = QtCore.QRect()
self.drag_position = QtCore.QPoint()
button = QtWidgets.QPushButton("Add", self)
button.clicked.connect(self.on_clicked)
self.resize(640, 480)
@QtCore.pyqtSlot()
def on_clicked(self):
if self.rect.isNull():
self.rect = QtCore.QRect(
QtCore.QPoint(*random.sample(range(200), 2)), QtCore.QSize(100, 100)
)
self.update()
def paintEvent(self, event):
super().paintEvent(event)
if not self.rect.isNull():
painter = QtGui.QPainter(self)
painter.setRenderHint(QtGui.QPainter.Antialiasing)
painter.setPen(QtGui.QPen(QtCore.Qt.black, 5, QtCore.Qt.SolidLine))
painter.drawRect(self.rect)
def mousePressEvent(self, event):
if self.rect.contains(event.pos()):
self.drag_position = event.pos() - self.rect.topLeft()
super().mousePressEvent(event)
def mouseMoveEvent(self, event):
if not self.drag_position.isNull():
self.rect.moveTopLeft(event.pos() - self.drag_position)
self.update()
super().mouseMoveEvent(event)
def mouseReleaseEvent(self, event):
self.drag_position = QtCore.QPoint()
super().mouseReleaseEvent(event)
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
Rect = Window()
Rect.show()
sys.exit(app.exec_())