使用Pyqt5中的连接功能连接两个圆圈

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

我正在尝试通过为必须连接的每对圆创建一个直线列表来实现将两个圆(从中心到中心的直线)连接在一起的功能。发生了一些错误,但是当我在圆列表中传递了两个对象并将相应的中心点传递到线列表时,它起作用了。有人可以帮助解决此问题以创建一个函数,该函数将在单击“加入”按钮并通过单击选择两个圈子时将其加入圈子下面是代码,该代码在运行时有两个带一行的圆,并具有通过单击“添加”按钮添加更多圆的功能。还是我使用了错误的技术,请提出建议,简化任何操作。奋斗了很长时间...我正在附上屏幕截图。enter image description here

import random
import sys
from PyQt5.QtWidgets import QMenu
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import QRect, QSize, QPoint, QLineF


class Window(QtWidgets.QMainWindow):
    def __init__(self):
        super(Window, self).__init__()

        self.rect = QtCore.QRect()
        self.drag_position = QtCore.QPoint()
        self.circles = [QRect(100, 200, 100, 100), QRect(100, 300, 100, 100)]
        self.lines = []
        self.a = [0, 0, 500, 400]
        self.current_circle = None
        button = QtWidgets.QPushButton("Add", self)
        button.clicked.connect(self.on_clicked)
        join = QtWidgets.QPushButton("Join", self)
        join.clicked.connect(self.joinAction)
        join.setGeometry(100, 0, 100, 30)
        Delete = QtWidgets.QPushButton("Delete", self)
        Delete.clicked.connect(self.DeleteItem)
        Delete.setGeometry(200, 0, 100, 30)
        self.resize(640, 480)


    def on_clicked(self):
        coor = QPoint(random.randrange(self.width() - 100), random.randrange(self.height()) - 100)
        self.circles.append(QRect(coor, QSize(100, 100)))
        self.update()

    def joinAction(self, event):
        pass


        contextMenu = QMenu(self)
        delAct = contextMenu.addAction("Delete Circle")
        action = contextMenu.exec_(self.mapToGlobal(event.pos()))
        if action == delAct:
            pass


    def DeleteItem(self):
        pass

    def paintEvent(self, event):
        super().paintEvent(event)

        painter = QtGui.QPainter(self)
        painter.setRenderHint(QtGui.QPainter.Antialiasing)
        painter.setPen(QtGui.QPen(QtCore.Qt.black, 5, QtCore.Qt.SolidLine))
        for circle in self.circles:
            painter.drawEllipse(circle)
        # for line in self.lines:
        painter.drawLine(self.circles[0].center(), self.circles[1].center())

    def mousePressEvent(self, event):
        for circle in self.circles:
            line = QLineF(circle.center(), event.pos())

            if line.length() < circle.width() / 2:
                self.current_circle = circle
                self.drag_position = event.pos()
                break


    def mouseMoveEvent(self, event):
        if self.current_circle is not None:
            self.current_circle.translate(event.pos() - self.drag_position)
            self.drag_position = event.pos()
            self.update()

    def mouseReleaseEvent(self, event):
        self.current_circle = None


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    Rect = Window()
    Rect.show()
    sys.exit(app.exec_())
python function pyqt pyqt5
1个回答
0
投票

这里是一种方法。我定义了一个具有属性Circleline_toline_from类,以跟踪连接了哪些圆。列表保存在Windowlast_two_clicked中,因此,单击“加入”按钮时,将按下的两个最近的圈子将被合并。它还会删除这些圈子和其他圈子之间的所有现有连接,因此圈子仅成对连接。

class Circle(QRect):

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.line_to = self.line_from = None

    def join(self, other):
        self.line_to = other
        other.line_from = self
        self.line_from = other.line_to = None


class Window(QtWidgets.QMainWindow):

    def __init__(self):
        super(Window, self).__init__()

        self.rect = QtCore.QRect()
        self.drag_position = QtCore.QPoint()
        self.circles = [Circle(100, 200, 100, 100), Circle(100, 300, 100, 100)]
        self.current_circle = None
        self.last_two_clicked = self.circles[:]

        button = QtWidgets.QPushButton("Add", self)
        button.clicked.connect(self.on_clicked)
        join = QtWidgets.QPushButton("Join", self)
        join.clicked.connect(self.joinAction)
        join.setGeometry(100, 0, 100, 30)
        Delete = QtWidgets.QPushButton("Delete", self)
        Delete.clicked.connect(self.DeleteItem)
        Delete.setGeometry(200, 0, 100, 30)
        self.resize(640, 480)

    def on_clicked(self):
        coor = (random.randrange(self.width() - 100), random.randrange(self.height() - 100))
        c = Circle(*coor, 100, 100)
        self.circles.append(c)
        self.last_two_clicked.insert(0, c)
        self.last_two_clicked = self.last_two_clicked[:2]
        self.update()

    def joinAction(self, event):
        c1, c2 = self.last_two_clicked
        c1.join(c2)
        self.update()

    def DeleteItem(self):
        pass

    def paintEvent(self, event):
        super().paintEvent(event)

        painter = QtGui.QPainter(self)
        painter.setRenderHint(QtGui.QPainter.Antialiasing)
        painter.setPen(QtGui.QPen(QtCore.Qt.black, 5, QtCore.Qt.SolidLine))
        for circle in self.circles:
            painter.drawEllipse(circle)
            if circle.line_to:
                painter.drawLine(circle.center(), circle.line_to.center())

    def mousePressEvent(self, event):
        for circle in self.circles:
            line = QLineF(circle.center(), event.pos())

            if line.length() < circle.width() / 2:
                self.current_circle = circle
                self.drag_position = event.pos()
                self.last_two_clicked.insert(0, circle)
                self.last_two_clicked = self.last_two_clicked[:2]
                break

    def mouseMoveEvent(self, event):
        if self.current_circle is not None:
            self.current_circle.translate(event.pos() - self.drag_position)
            self.drag_position = event.pos()
            self.update()

    def mouseReleaseEvent(self, event):
        self.current_circle = None
© www.soinside.com 2019 - 2024. All rights reserved.