Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在画布的任何位置创建可以在画布上的任何位置移动的正方形_Python_Pyqt_Pyqt5 - Fatal编程技术网

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

Python 如何在画布的任何位置创建可以在画布上的任何位置移动的正方形,python,pyqt,pyqt5,Python,Pyqt,Pyqt5,我已经在画布中的任意位置创建了一个正方形,但我不知道如何通过将其拖动到所需位置来将其移动到画布中的其他位置,请建议一些编辑或新方法以实现建议的任务,我正在学习 附一张输出窗口的截图 import sys from random import randint from PyQt5 import QtWidgets from PyQt5.QtWidgets import QApplication, QMainWindow,QPushButton,QWidget from PyQt5 import Q

我已经在画布中的任意位置创建了一个正方形,但我不知道如何通过将其拖动到所需位置来将其移动到画布中的其他位置,请建议一些编辑或新方法以实现建议的任务,我正在学习

附一张输出窗口的截图

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_())


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

在这种情况下,您可以使用正方形的中心、正方形的尺寸等,并且必须通过可以从头创建的数据结构来实现数据,例如通过创建包含矩形信息的类,但是在Qt中,没有必要创建该元素,因为它已经存在并且是QRect

现在该元素已被识别,您可以创建一个QRect,按下按钮时其左上角是随机的,并使用该QRect绘制它

用于拖动的程序是:

  • 获取鼠标单击的位置
  • 确认单击位于矩形内
  • 计算相对于矩形的位置
  • 移动鼠标时,必须根据鼠标按下的位置更新矩形的位置
考虑到上述所有因素,解决方案是:

随机导入
导入系统
从PyQt5导入QtCore、QtGui、QtWidgets
类窗口(QtWidgets.QMainWindow):
定义初始化(自):
超级(窗口,自我)。\uuuu初始化
self.rect=QtCore.QRect()
self.drag_position=QtCore.QPoint()
button=QtWidgets.QPushButton(“添加”,自我)
按钮。单击。连接(单击时自行)
自我调整大小(640480)
@QtCore.pyqtSlot()
已单击的def(自身):
如果self.rect.isNull():
self.rect=QtCore.QRect(
QtCore.QPoint(*random.sample(范围(200),2)),QtCore.QSize(100100)
)
self.update()
def paintEvent(自身,事件):
super().paintEvent(事件)
如果不是self.rect.isNull():
painter=QtGui.QPainter(自)
painter.setRenderHint(QtGui.QPainter.Antialiasing)
painter.setPen(QtGui.QPen(QtCore.Qt.black,5,QtCore.Qt.SolidLine))
painter.drawRect(self.rect)
def鼠标压力事件(自身、事件):
如果self.rect.contains(event.pos()):
self.drag_position=event.pos()-self.rect.topLeft()
super().mousePressEvent(事件)
def mouseMoveEvent(自身、事件):
如果不是self.drag\u position.isNull():
self.rect.moveTopLeft(event.pos()-self.drag\u位置)
self.update()
super().mouseMoveEvent(事件)
def mouseReleaseEvent(自身,事件):
self.drag_position=QtCore.QPoint()
super().mouseReleaseEvent(事件)
如果名称=“\uuuuu main\uuuuuuuu”:
app=qtwidts.QApplication(sys.argv)
Rect=Window()
Rect.show()
sys.exit(app.exec_())

如何将其扩展到多个对象?(创建多个正方形并在画布中移动它们)@teecup逻辑类似:1)创建多个QRect,2)检测鼠标单击是否在QRect上,3)移动QRect(2)。@teecup 5)我建议您尝试一些东西(花必要的时间:可能一天、两天或一周)只有当没有什么对你有用的时候,你才可以发布一个新的问题,清楚地说明你想做什么,通过展示证明它的代码来描述你已经尝试了什么。考虑到我不会在评论中回答任何问题。因此,不是一个软件编写服务,其中OP说:“给我代码。”我已经指出了具体步骤,所以你至少应该尝试一下。我尝试创建一个矩形列表来存储QRect的每个实例,并在调用mouseReleaseEvent时将其附加到列表的末尾,但它似乎不起作用。我至少应该做什么请指导我并建议我为此目的所需的文档。我没有找到合适的文档和来源来正确地学习,所以你是对的,但我真的很想学习。@teecup他所要求的永远不会出现在文档中。通过写一个新问题来表明你想学习,展示你已经尝试过的东西(我已经在我的第一条评论中指出了步骤)。