我正在尝试通过为必须连接的每对圆创建一个直线列表来实现将两个圆(从中心到中心的直线)连接在一起的功能。发生了一些错误,但是当我在圆列表中传递了两个对象并将相应的中心点传递到线列表时,它起作用了。有人可以帮助解决此问题以创建一个函数,该函数将在单击“加入”按钮并通过单击选择两个圈子时将其加入圈子下面是代码,该代码在运行时有两个带一行的圆,并具有通过单击“添加”按钮添加更多圆的功能。还是我使用了错误的技术,请提出建议,简化任何操作。奋斗了很长时间...我正在附上屏幕截图。
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_())
这里是一种方法。我定义了一个具有属性Circle
和line_to
的line_from
类,以跟踪连接了哪些圆。列表保存在Window
类last_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