我想创建一个不同的文本框(从文本框列表中出现),单击文本按钮时创建的每个圆圈都将出现

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

我已经在名为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_())
listview pyqt5 qlineedit
1个回答
0
投票

此循环不执行任何操作。因为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
© www.soinside.com 2019 - 2024. All rights reserved.