我已经在名为circlelabel的圈子类中定义了一个私有方法,当我绘制一个圈子时,我想在其中显示文本框列表(此处称为标签)中的特定文本框。我已经隐藏了文本框,然后想在绘制圆圈后立即显示它,我不知道为什么它没有显示任何文本框。此外,在用户编辑时,我希望以下情况下的某些文本“ Circle”已经预先存在。我想使每个圆圈的文字都与众不同。
import random
import sys
import math
from PyQt5.QtWidgets import QMenu
from PyQt5 import QtCore, QtGui, QtWidgets, Qt
from PyQt5.QtCore import QRect, QSize, QPoint, QLineF
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
def Delete(self):
pass
def circlelabel(self):
self.line_edit.setText('circle')
self.line_edit.move(60, 100)
self.line_edit.show()
class Window(QtWidgets.QMainWindow):
def __init__(self):
super(Window, self).__init__()
self.rect = QtCore.QRect()
self.drag_position = QtCore.QPoint()
self.circles = []
self.labels=[]
for line_edit in self.labels:
self.line_edit = QtWidgets.QLineEdit(self)
self.line_edit.hide()
self.current_circle = None
self.last_two_clicked = self.circles[:]
button = QtWidgets.QPushButton("Add", self)
button.setIcon(QtGui.QIcon("addbutton.png"))
button.setToolTip("<h3>This is for creating random circles<h3>")
button.clicked.connect(self.on_clicked)
joinb = QtWidgets.QPushButton("Join", self)
joinb.setGeometry(100, 0, 100, 30)
joinb.setIcon(QtGui.QIcon("circleicon.png"))
joinb.setToolTip('This is for joining the two circles with a line')
joinb.clicked.connect(self.joinAction)
Delete = QtWidgets.QPushButton("Delete", self)
Delete.setIcon(QtGui.QIcon("deleteicon.jpg"))
Delete.clicked.connect(self.DeleteItem)
Delete.setToolTip("<h3>This is for deleting the circle from canvas area<h3>")
Delete.setGeometry(200, 0, 100, 30)
Report= QtWidgets.QPushButton("Generate Report", self)
Report.setGeometry(QRect(300, 0, 120, 30))
Report.setIcon(QtGui.QIcon("generatereport.png"))
Report.setToolTip("This is for generating pdf report of connection between two circles")
Saveimg= QtWidgets.QPushButton("Save", self)
Saveimg.setGeometry(QRect(420, 0, 100, 30))
Saveimg.setIcon(QtGui.QIcon("saveicon.png"))
Saveimg.setToolTip("This is for saving an image of canvas area")
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 contextMenuEvent(self, event):
menu = QMenu("Circle")
remove = menu.addAction("Delete Circle")
#remove.triggered.connect(self.DeleteItem)
a = menu.exec_(self.mapToGlobal(event.Pos()))
if a == remove:
self.close()
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
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
Rect = Window()
Rect.show()
sys.exit(app.exec_())
此循环不执行任何操作。因为self.labels
是一个空列表,所以它有0次迭代。
self.labels=[]
for line_edit in self.labels:
self.line_edit = QtWidgets.QLineEdit(self)
self.line_edit.hide()
我不确定您是否要在列表中使用固定数量的QLineEdits,但我认为您应该通过在每个新圆上添加QLineEdit来动态创建列表。我编辑了代码,以添加一个QLineEdit,其中当前圆编号位于圆上方。它将也随圆移动。看一下on_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
if self.line_from and self.line_from.line_to == self:
self.line_from.line_to = None
self.line_from = other.line_to = None
def Delete(self):
pass
def circlelabel(self, n):
self.line_edit.setText('Circle ' + str(n))
self.move_line_edit()
self.line_edit.show()
def move_line_edit(self):
self.line_edit.move(self.topLeft().x(), self.topLeft().y() - 40)
class Window(QtWidgets.QMainWindow):
def __init__(self):
super(Window, self).__init__()
self.rect = QtCore.QRect()
self.drag_position = QtCore.QPoint()
self.circles = []
self.labels=[]
self.current_circle = None
self.last_two_clicked = self.circles[:]
button = QtWidgets.QPushButton("Add", self)
button.setIcon(QtGui.QIcon("addbutton.png"))
button.setToolTip("<h3>This is for creating random circles<h3>")
button.clicked.connect(self.on_clicked)
joinb = QtWidgets.QPushButton("Join", self)
joinb.setGeometry(100, 0, 100, 30)
joinb.setIcon(QtGui.QIcon("circleicon.png"))
joinb.setToolTip('This is for joining the two circles with a line')
joinb.clicked.connect(self.joinAction)
Delete = QtWidgets.QPushButton("Delete", self)
Delete.setIcon(QtGui.QIcon("deleteicon.jpg"))
Delete.clicked.connect(self.DeleteItem)
Delete.setToolTip("<h3>This is for deleting the circle from canvas area<h3>")
Delete.setGeometry(200, 0, 100, 30)
Report= QtWidgets.QPushButton("Generate Report", self)
Report.setGeometry(QRect(300, 0, 120, 30))
Report.setIcon(QtGui.QIcon("generatereport.png"))
Report.setToolTip("This is for generating pdf report of connection between two circles")
Saveimg= QtWidgets.QPushButton("Save", self)
Saveimg.setGeometry(QRect(420, 0, 100, 30))
Saveimg.setIcon(QtGui.QIcon("saveicon.png"))
Saveimg.setToolTip("This is for saving an image of canvas area")
self.resize(640, 480)
def on_clicked(self):
coor = (random.randrange(self.width() - 100), random.randrange(self.height() - 100))
c = Circle(*coor, 100, 100)
text_box = QtWidgets.QLineEdit(self)
c.line_edit = text_box
self.labels.append(text_box)
c.circlelabel(len(self.labels))
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 contextMenuEvent(self, event):
menu = QMenu("Circle")
remove = menu.addAction("Delete Circle")
#remove.triggered.connect(self.DeleteItem)
a = menu.exec_(self.mapToGlobal(event.pos()))
if a == remove:
self.close()
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.current_circle.move_line_edit()
self.drag_position = event.pos()
self.update()
def mouseReleaseEvent(self, event):
self.current_circle = None