Python 如何通过在PyQt5中拖动图形(使用paintEvent创建)来移动图形

Python 如何通过在PyQt5中拖动图形(使用paintEvent创建)来移动图形,python,pyqt,pyqt5,draggable,Python,Pyqt,Pyqt5,Draggable,我在画布中的任意位置创建了一个圆,但我无法通过单击并拖动它来移动或编辑它的属性,就像它的标签一样。 我想创建一个可以通过拖动移动的圆,其属性(如标签)可以随时编辑。请建议编辑或使用新方法。我是一个初学者请帮助 import sys from PyQt5 import QtWidgets from PyQt5.QtWidgets import QApplication, QMainWindow,QPushButton,QWidget from PyQt5 import QtGui from PyQ

我在画布中的任意位置创建了一个圆,但我无法通过单击并拖动它来移动或编辑它的属性,就像它的标签一样。 我想创建一个可以通过拖动移动的圆,其属性(如标签)可以随时编辑。请建议编辑或使用新方法。我是一个初学者请帮助

import sys
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
from random import randint

class Window(QMainWindow):
    def __init__(self):
        super(Window,self).__init__()
        title="layout management"
        left=500
        top=200
        width=500
        height=400
        iconName="Ash.jpg"
        self.setWindowTitle(title)
        self.setWindowIcon(QtGui.QIcon(iconName))
        self.setGeometry(left, top, width, height)
        self.should_paint_circle = False
        self.windowcomponents()
        self.initUI()
        self.show()
    def initUI(self):
        if self.should_paint_circle:
            self.label=QtWidgets.QLabel(self)
            self.label.setText('<h2>circle<h2>')
    def windowcomponents(self):
        button=QPushButton("Add", self)
        button.setGeometry(QRect(0, 0, 50, 28))
        button.setIcon(QtGui.QIcon("addbutton.png"))
        button.setToolTip("<h3>This is for creating random circles<h3>")
        button.clicked.connect(self.paintcircle)
        button=QPushButton("Generate Report", self)
        button.setGeometry(QRect(49,0,150,28))
        button.setIcon(QtGui.QIcon("generatereport.png"))
        button.setToolTip("This is for generating pdf report of connection between two circles")
        button=QPushButton("Save", self)
        button.setGeometry(QRect(199,0,120,28))
        button.setIcon(QtGui.QIcon("saveicon.png"))
        button.setToolTip("This is for saving an image of canvas area")

    def paintEvent(self, event):
        super().paintEvent(event)
        if self.should_paint_circle:
            painter = QtGui.QPainter(self)
            painter.setRenderHint(QPainter.Antialiasing)
            painter.setPen(QPen(Qt.black, 5, Qt.SolidLine))
            painter.drawEllipse(randint(0,500), randint(0,500), 100, 100)
            self.initUI()
            self.label.move(60,100)
    def paintcircle(self, painter):
        self.should_paint_circle = True
        self.update()
app = QApplication(sys.argv)
circle=Window()
circle.show()
sys.exit(app.exec_())
导入系统 从PyQt5导入QtWidgets 从PyQt5.QtWidgets导入QApplication、QMainWindow、QPushButton、QWidget 从PyQt5导入QtGui 从PyQt5.QtCore导入QRect,Qt 从PyQt5.QtGui导入QPainter、QBrush、QPen 从PyQt5导入QtCore 从随机导入randint 类窗口(QMainWindow): 定义初始化(自): 超级(窗口,自我)。\uuuu初始化 title=“布局管理” 左=500 顶部=200 宽度=500 高度=400 iconName=“Ash.jpg” self.setWindowTitle(标题) self.setWindowIcon(QtGui.QIcon(iconName)) self.setGeometry(左、上、宽、高) self.should\u paint\u circle=False self.windowcomponents() self.initUI() self.show() def initUI(self): 如果self.should\u画一个圆圈: self.label=qtwidts.QLabel(self) self.label.setText('circle')) def windowcomponents(自): 按钮=QPushButton(“添加”,自我) 按钮。设置几何图形(QRect(0,0,50,28)) setIcon(QtGui.QIcon(“addbutton.png”)) setToolTip(“用于创建随机圆”) 按钮。单击。连接(self.paintcircle) 按钮=QPushButton(“生成报告”,自我) 按钮设置几何(QRect(49,0150,28)) setIcon(QtGui.QIcon(“generatereport.png”)) setToolTip(“用于生成两个圆圈之间连接的pdf报告”) 按钮=QPushButton(“保存”,自我) 按钮。设置几何(QRect(199,0120,28)) setIcon(QtGui.QIcon(“saveicon.png”)) setToolTip(“用于保存画布区域的图像”) def paintEvent(自身,事件): super().paintEvent(事件) 如果self.should\u画一个圆圈: painter=QtGui.QPainter(自) painter.setRenderInt(QPainter.AntiAlias) 画师设置笔(QPen(Qt.black,5,Qt.SolidLine)) 画家,画家(兰丁(0500),兰丁(0500),100100) self.initUI() self.label.move(60100) def paintcircle(自我、画家): self.should\u paint\u circle=真 self.update() app=QApplication(sys.argv) 圆圈=窗口() 循环显示() sys.exit(app.exec_()) 显示窗口中任意位置的圆的图像,它不可拖动


解决方案类似,代码仅在如何确定按下的点是否在圆内发生了更改:

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.drawEllipse(self.rect)

    def mousePressEvent(self, event):
        if (
            2 * QtGui.QVector2D(event.pos() - self.rect.center()).length()
            < self.rect.width()
        ):
            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_())
随机导入
导入系统
从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))
画师。抽屉(自我纠正)
def鼠标压力事件(自身、事件):
如果(
2*QtGui.QVector2D(event.pos()-self.rect.center()).length()
< self.rect.width()
):
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_())
我已经修改了上面的代码以生成多个动态循环。现在我想用一条线连接任意两条线(上面有LineEdit),当圆移动时,线也应该随之移动。任何提示或帮助都将不胜感激。