如何在画布的任何位置创建一个可以在画布上的任何位置移动的正方形

问题描述 投票:0回答:1

我已经在画布上的任意位置创建了一个正方形,但是我不知道如何通过将其拖动到画布上的其他位置来将其移动到画布上的其他位置,请提出一些编辑建议或新方法以完成建议的任务,我正在学习的同时。

P.S。附上输出窗口的屏幕截图。

<< img src =“ https://image.soinside.com/eyJ1cmwiOiAiaHR0cHM6Ly9pLnN0YWNrLmltZ3VyLmNvbS9hS2pzNC5wbmcifQ==” alt =“在此处输入图像描述”>

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_())
python pyqt pyqt5
1个回答
0
投票

创建动态元素的逻辑是表示一组特定的特征,通过修改这些特征,可以修改该元素。

在这种情况下,您可以使用正方形的中心,正方形的尺寸等,并且必须通过可从头开始创建的数据结构来实现数据,例如,通过创建具有以下信息的类:矩形,但是在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_())
© www.soinside.com 2019 - 2024. All rights reserved.