как отобразить текстовую метку, а также нарисовать круг при нажатии кнопки «ДОБАВИТЬ» - PullRequest
0 голосов
/ 04 марта 2020

Я прочитал всю связанную статью о нескольких слотах с одним сигналом, но я не могу отобразить во время рисования круга, которые запускаются кнопкой pu sh «ДОБАВИТЬ». Я могу отобразить текстовую метку возле круга перед нажатием кнопки, но хочу, чтобы она отображалась только после нажатия кнопки. Пожалуйста помоги. Кроме того, я хочу, чтобы текстовая метка находилась рядом с кружком, и ее можно изменить в любое время, нажав

import sys
from PyQt5 import QtWidgets
from PyQt5.QtWidgets import QApplication, QMainWindow,QPushButton,QWidget
from PyQt5 import QtGui
from PyQt5.QtCore import QRect,Qt
from PyQt5.QtGui import QPainter,QBrush, QPen
from PyQt5 import QtCore


class Window(QMainWindow):
   def __init__(self):
        super(Window,self).__init__()
        title="layout management"
        left=500
        top=200
        width=500
        height=400
        iconName="fosseeicon.jpg"
        self.setWindowTitle(title)
        self.setWindowIcon(QtGui.QIcon(iconName))
        self.setGeometry(left, top, width, height)
        self.should_paint_circle = False
        self.windowcomponents()
        self.initUI()
        self.show()
   def initUI(self):
       if self.should_paint_circle:
           self.label=QtWidgets.QLabel(self)
           self.label.setText('<h2>circle<h2>')
   def windowcomponents(self):
       button=QPushButton("Add", self)
       button.setGeometry(QRect(0, 0, 50, 28))
       button.setIcon(QtGui.QIcon("addbutton.png"))
       button.setToolTip("<h3>This is for creating random circles<h3>")
       button.clicked.connect(self.paintcircle)
       button=QPushButton("Generate Report", self)
       button.setGeometry(QRect(49,0,150,28))
       button.setIcon(QtGui.QIcon("generatereport.png"))
       button.setToolTip("This is for generating pdf report of connection between two circles")
       button=QPushButton("Save", self)
       button.setGeometry(QRect(199,0,120,28))
       button.setIcon(QtGui.QIcon("saveicon.png"))
       button.setToolTip("This is for saving an image of canvas area")

   def paintEvent(self, event):
       super().paintEvent(event)
       if self.should_paint_circle:
           painter = QtGui.QPainter(self)
           painter.setRenderHint(QPainter.Antialiasing)
           painter.setPen(QPen(Qt.black, 5, Qt.SolidLine))
           painter.drawEllipse(100, 100, 100, 100)
           self.initUI()
           self.label.move(60,100)
   def paintcircle(self, painter):
       self.should_paint_circle = True
       self.update()
app = QApplication(sys.argv)
circle=Window()
circle.show()
sys.exit(app.exec_())

1 Ответ

0 голосов
/ 04 марта 2020

Виджеты, созданные с родителем вне их __init__ (или родительских элементов), но не , добавленные в макет, должны быть явно показаны; вам не хватает этого:

    self.label.show()

Кроме того, вы НЕ ДОЛЖНЫ создавать новые виджеты внутри paintEvent.

Рисование - это то, что часто случается, обычно в следующие ситуации (которые случаются очень часто :

  • , когда виджет отображается впервые
  • всякий раз, когда виджет скрыт и отображается снова (например, после сворачивание и восстановление окна)
  • всякий раз, когда мышь входит или выходит из него и / или его дочерних элементов
  • при изменении размера виджета или любого из его родителей
  • при отображается новый дочерний элемент

В результате, если вы добавите виджет для каждого события рисования, вы, вероятно, получите десятки (если не сотни или тысячи) виджетов, и , что наиболее важно, если вы также покажете это, это вызовет бесконечную рекурсию.

class Window(QMainWindow):
    def __init__(self):
        super(Window,self).__init__()
        title="layout management"
        left=500
        top=200
        width=500
        height=400
        iconName="fosseeicon.jpg"
        self.setWindowTitle(title)
        self.setWindowIcon(QtGui.QIcon(iconName))
        self.setGeometry(left, top, width, height)
        self.should_paint_circle = False
        self.windowcomponents()
        self.label = QtWidgets.QLabel(self)
        self.label.hide()

    # ...

    def paintEvent(self, event):
        super().paintEvent(event)
        if self.should_paint_circle:
            painter = QtGui.QPainter(self)
            painter.setRenderHint(QPainter.Antialiasing)
            painter.setPen(QPen(Qt.black, 5, Qt.SolidLine))
            painter.drawEllipse(100, 100, 100, 100)

    def paintcircle(self, painter):
        self.should_paint_circle = True
        self.label.setText('<h2>circle<h2>')
        self.label.move(60,100)
        self.label.show()
        self.update()

Тем не менее, на основании этого и предыдущего вопроса я предлагаю вам изучить документацию более тщательно, особенно то, что отн Относится к QMainWindow , Управлению раскладкой , в Qt и соответствующей документации QPainter .

...