как отображать текстовую метку, а также рисовать круг при нажатии кнопки ДОБАВИТЬ

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

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_())

person Community    schedule 04.03.2020    source источник
comment
Объясните это предложение: можно изменить в любое время по щелчку   -  person eyllanesc    schedule 04.03.2020
comment
это означает, что пользователь может изменить текстовую метку при нажатии   -  person    schedule 04.03.2020
comment
то есть пользователь может изменить текстовую метку всякий раз, когда он щелкает по ней.   -  person    schedule 04.03.2020


Ответы (1)


Виджеты, созданные с родителем за пределами их __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 документация.

person musicamante    schedule 04.03.2020
comment
пожалуйста, предложите, как читать документацию, с чего начать, потому что я новичок в pyqt5, и я изучил основы с помощью программирования на python в видео на YouTube. Более того, некоторые ссылки, которые вы дали выше, показывают код на С++. - person ; 05.03.2020
comment
Пожалуйста, ответьте в ближайшее время - person ; 05.03.2020
comment
Документация предназначена для C++, но функции и параметры одинаковы в Python для 99% классов и их функций: на страницах, связанных с классами, для каждой функции слева указано возвращаемое значение (void означает, что она возвращает В Python нет), справа имя функции и ее параметры. В случае сомнений относительно параметров и возвращаемых значений используйте help(class.function) в оболочке python или прочитайте документацию по PyQt. . Кроме того, вся логика каждого класса применима к Python так же, как и к C++. - person musicamante; 05.03.2020