简体   繁体   中英

How to move a figure(created using paintEvent) by simply draging it in PyQt5

I have created a circle at random place in canvas, but I am unable to move or edit its properties like its label just by clicking and dragging it. I want to create a circle that is movable by dragging and its properties like label are editable at any time please suggest the edits or new approach to do it. I am a beginner Please help...

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

Image showing a circle at random position in window, its not draggable

The solution is similar, the code only changed in how to determine if the pressed point is inside the circle:

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

    def mousePressEvent(self, event):
        if (
            
        ):
            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_())

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM