Как переместить фигуру (созданную с помощью paintEvent), просто перетащив ее в PyQt5 - PullRequest
0 голосов
/ 07 марта 2020

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

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

Изображение, показывающее круг в произвольном положении в окне, его нельзя перетаскивать

1 Ответ

0 голосов
/ 07 марта 2020

Решение похоже, код изменился только в том, как определить, находится ли нажатая точка внутри круга:

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

    def mousePressEvent(self, event):
        if (
            <b>2 * QtGui.QVector2D(event.pos() - self.rect.center()).length()
            &lt self.rect.width()</b>
        ):
            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_())
...