Python 使用Pyqt5中的连接函数连接两个圆

Python 使用Pyqt5中的连接函数连接两个圆,python,function,pyqt,pyqt5,Python,Function,Pyqt,Pyqt5,我试图实现一个函数,通过为每对必须连接的圆创建一个线列表,将两个圆连接起来(从中心到中心有一条线)。有一些错误,但当我将圆列表中的两个对象和相应的中心点传递给直线列表时,它起作用了。 是否有人可以帮助解决这个问题,创建一个函数,在单击“连接”按钮并通过单击选择两个圆时连接这些圆 下面是代码,当运行时有两个带线的圆,并且有通过单击“添加”按钮添加更多圆的功能。或者我采用了错误的技术,请建议是否有更简单的方法。挣扎了很长时间。。。我附上一个截图 随机导入 导入系统 从PyQt5.qtwidts导入Q

我试图实现一个函数,通过为每对必须连接的圆创建一个线列表,将两个圆连接起来(从中心到中心有一条线)。有一些错误,但当我将圆列表中的两个对象和相应的中心点传递给直线列表时,它起作用了。 是否有人可以帮助解决这个问题,创建一个函数,在单击“连接”按钮并通过单击选择两个圆时连接这些圆 下面是代码,当运行时有两个带线的圆,并且有通过单击“添加”按钮添加更多圆的功能。或者我采用了错误的技术,请建议是否有更简单的方法。挣扎了很长时间。。。我附上一个截图

随机导入
导入系统
从PyQt5.qtwidts导入QMenu
从PyQt5导入QtCore、QtGui、QtWidgets
从PyQt5.QtCore导入QRect、QSize、QPoint、QLineF
类窗口(QtWidgets.QMainWindow):
定义初始化(自):
超级(窗口,自我)。\uuuu初始化
self.rect=QtCore.QRect()
self.drag_position=QtCore.QPoint()
self.circles=[QRect(100200100100),QRect(100300100100)]
self.lines=[]
self.a=[0,0500400]
self.current\u circle=无
button=QtWidgets.QPushButton(“添加”,自我)
按钮。单击。连接(单击时自行)
join=qtwidts.QPushButton(“join”,self)
join.clicked.connect(self.joinAction)
join.setGeometry(100,0,100,30)
Delete=qtwidts.QPushButton(“删除”,self)
Delete.clicked.connect(self.DeleteItem)
删除.setGeometry(200,0,100,30)
自我调整大小(640480)
已单击的def(自身):
coor=QPoint(random.randrange(self.width()-100)、random.randrange(self.height())-100)
self.circles.append(QRect(coor,QSize(100100)))
self.update()
def joinAction(自身、事件):
通过
contextMenu=QMenu(自身)
delAct=contextMenu.addAction(“删除圆”)
action=contextMenu.exec(self.mapToGlobal(event.pos()))
如果action==delAct:
通过
def删除项(自身):
通过
def paintEvent(自身,事件):
super().paintEvent(事件)
painter=QtGui.QPainter(自)
painter.setRenderHint(QtGui.QPainter.Antialiasing)
painter.setPen(QtGui.QPen(QtCore.Qt.black,5,QtCore.Qt.SolidLine))
对于self.circles中的圆:
画家。抽屉(圆形)
#对于self.line中的行:
painter.drawine(self.circles[0].center(),self.circles[1].center())
def鼠标压力事件(自身、事件):
对于self.circles中的圆:
line=QLineF(circle.center(),event.pos())
如果line.length()
这里有一种方法。我定义了一个
Circle
类,其属性为
line\u to
line\u from
,以跟踪哪些圆是连接的。一个列表保存在
窗口
类中,
最后两次单击
,因此当单击“连接”按钮时,最近按下的两个圆圈将连接在一起

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
        if self.line_from and self.line_from.line_to == self:
            self.line_from.line_to = None
        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
类圈(QRect):
定义初始化(self,*args,**kwargs):
super()
self.line\u to=self.line\u from=无
def连接(自身、其他):
self.line_to=其他
other.line_from=自
如果self.line_from和self.line_from.line_to==self:
self.line\u from.line\u to=无
self.line\u from=other.line\u to=None
类窗口(QtWidgets.QMainWindow):
定义初始化(自):
超级(窗口,自我)。\uuuu初始化
self.rect=QtCore.QRect()
self.drag_position=QtCore.QPoint()
self.circles=[圆(100200100100),圆(100300100100)]
self.current\u circle=无
self.last\u two\u clicked=self.circles[:]
button=QtWidgets.QPushButton(“添加”,自我)
按钮。单击。连接(单击时自行)
join=qtwidts.QPushButton(“join”,self)
join.clicked.connect(self.joinAction)
join.setGeometry(100,0,100,30)
Delete=qtwidts.QPushButton(“删除”,self)
Delete.clicked.connect(self.DeleteItem)
删除.setGeometry(200,0,100,30)
自我调整大小(640480)
已单击的def(自身):
coor=(random.randrange(self.width()-100),random.randrange(self.height()-100))
c=圆(*coor,100100)
self.circles.append(c)
self.last\u two\u clicked.insert(0,c)
self.last\u two\u clicked=self.last\u two\u clicked[:2]
self.update()
def joinAction(自身、事件):
c1,c2=自己最后两次点击
c1.加入(c2)
self.update()
def删除项(自身):
通过
def paintEvent(自身,事件):
super().paintEvent(事件)
painter=QtGui.QPainter(自)
painter.setRenderHint(QtGui.QPainter.Antialiasing)
painter.setPen(QtGui.QPen(QtCore.Qt.black,5,QtCore.Qt.SolidLine))
对于self.circles中的圆:
画家。抽屉(圆形)
如果circle.line_指向:
绘制线(圆.center(),圆.line_至.center())
def鼠标压力事件(自身、事件):
对于self.circles中的圆:
line=QLineF(circle.center(),event.pos())
如果line.length()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
        if self.line_from and self.line_from.line_to == self:
            self.line_from.line_to = None
        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