Как создать квадрат в любой позиции холста, который можно переместить в любую позицию на холсте - PullRequest
1 голос
/ 07 марта 2020

Я создал квадрат в произвольной позиции на холсте, но я не знаю, как переместить его в другое место на холсте, перетаскивая его в нужную позицию. Пожалуйста, предложите некоторые изменения или новый метод для достижения предложенной задачи. , Учусь при этом.

PS Прикреплен скриншот окна вывода.

enter image description here

import sys
from random import randint
from PyQt5 import QtWidgets
from PyQt5.QtWidgets import QApplication, QMainWindow,QPushButton,QWidget
from PyQt5 import QtGui
from PyQt5.QtCore import QRect,Qt
from PyQt5.QtGui import QPainter,QBrush, QPen
from PyQt5 import QtCore


class Window(QMainWindow):
    def __init__(self):
        super(Window,self).__init__()
        title="TeeSquare"
        left=500
        top=200
        width=500
        height=400
        iconName="square.jpg"
        self.setWindowTitle(title)
        self.setWindowIcon(QtGui.QIcon(iconName))
        self.setGeometry(left, top, width, height)
        self.should_paint_Rect = False
        self.windowcomponents()
        self.initUI()
        self.show()

    def initUI(self):
        if self.should_paint_Rect:
            self.label=QtWidgets.QLabel(self)
            self.label.setText("circle")

    def windowcomponents(self):
        button=QPushButton("Add", self)
        button.setGeometry(QRect(0, 0, 50, 28))
        button.setIcon(QtGui.QIcon("Add.png"))
        button.setToolTip("Create Square")
        button.clicked.connect(self.paintRect)


    def paintEvent(self, event):
        super().paintEvent(event)
        if self.should_paint_Rect:
            painter = QtGui.QPainter(self)
            painter.setRenderHint(QPainter.Antialiasing)
            painter.setPen(QPen(Qt.black, 5, Qt.SolidLine))
            painter.drawRect(randint(0,500), randint(0,500), 100, 100)
            self.initUI()
            self.label.move(60,100)

    def paintRect(self, painter):
        self.should_paint_Rect = True
        self.update()

app = QApplication(sys.argv)
Rect=Window()
Rect.show()
sys.exit(app.exec_())

1 Ответ

1 голос
/ 07 марта 2020

Логика 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_())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...