Не отображается динамически созданный элемент Qlabel в QFrame

При добавлении QLabel в QFrame элемент не отображается в нем, но создается.

Если изначально создать объект QLabel в конструкторе класса и при нажатии на QButton последний отобразится, но изначально будет создан в QFrame, но будет невидимым (что не нужно).

Как динамически создавать один и тот же QLabel в QFrame чтобы изначально QFrame не имел дочерних элементов, а они появлялись в нем только после нажатия на кнопку.

class Ui_MainWindow(object):
def __init__(self):
    self._translate = QtCore.QCoreApplication.translate

def setupUi(self, MainWindow):
    MainWindow.setObjectName("MainWindow")
    MainWindow.resize(1000, 600)
    self.centralwidget = QtWidgets.QWidget(MainWindow)
    self.centralwidget.setObjectName("centralwidget")
    self.gridLayout = QtWidgets.QGridLayout(self.centralwidget)
    self.gridLayout.setObjectName("gridLayout")
    self.widget = QtWidgets.QWidget(self.centralwidget)
    self.widget.setObjectName("widget")
    self.gridLayout_2 = QtWidgets.QGridLayout(self.widget)
    self.gridLayout_2.setObjectName("gridLayout_2")

    self.frame = QtWidgets.QFrame(self.widget)
    self.frame.setFrameShape(QtWidgets.QFrame.StyledPanel)
    self.frame.setFrameShadow(QtWidgets.QFrame.Raised)
    self.frame.setObjectName("frame")


    self.gridLayout_2.addWidget(self.frame, 0, 0, 1, 1)
    self.gridLayout.addWidget(self.widget, 0, 0, 1, 1)

    self.widget_2 = QtWidgets.QWidget(self.centralwidget)
    self.widget_2.setObjectName("widget_2")

    self.pushButton = QtWidgets.QPushButton(self.widget_2)
    self.pushButton.setGeometry(QtCore.QRect(30, 30, 113, 32))
    self.pushButton.setObjectName("pushButton")
    self.pushButton.clicked.connect(self.addLabel)
    self.gridLayout.addWidget(self.widget_2, 0, 1, 1, 1)
    MainWindow.setCentralWidget(self.centralwidget)
    self.menubar = QtWidgets.QMenuBar(MainWindow)
    self.menubar.setGeometry(QtCore.QRect(0, 0, 1000, 22))
    self.menubar.setObjectName("menubar")
    MainWindow.setMenuBar(self.menubar)
    self.statusbar = QtWidgets.QStatusBar(MainWindow)
    self.statusbar.setObjectName("statusbar")
    MainWindow.setStatusBar(self.statusbar)

    self.retranslateUi(MainWindow)
    QtCore.QMetaObject.connectSlotsByName(MainWindow)

def retranslateUi(self, MainWindow):
    MainWindow.setWindowTitle(self._translate("MainWindow", "MainWindow"))
    self.pushButton.setText(self._translate("MainWindow", "PushButton"))

def addLabel(self):
    self.label = QtWidgets.QLabel(self.frame)
    self.label.setGeometry(QtCore.QRect(random.randint(1, 30), random.randint(1, 30), 60, 16))
    self.label.setObjectName("label")
    self.label.setText(self._translate("MainWindow", "TextLabel"))
    print(self.frame.children())


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

Ответы (1 шт):

Автор решения: S. Nick

Не уверен что правильно понимаю вас, но я увидел вашу задачу так:

import sys
import random
from PyQt5 import QtCore, QtGui, QtWidgets  
from PyQt5.Qt import *


class Ui_MainWindow(object):
    def __init__(self):
        self._translate = QtCore.QCoreApplication.translate

    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(1000, 600)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        
        self.gridLayout = QtWidgets.QGridLayout(self.centralwidget)
        self.gridLayout.setObjectName("gridLayout")
        
        self.widget = QtWidgets.QWidget(self.centralwidget)
        self.widget.setObjectName("widget")
        self.gridLayout_2 = QtWidgets.QGridLayout(self.widget)
        self.gridLayout_2.setObjectName("gridLayout_2")

        self.frame = QtWidgets.QFrame(self.widget)
        self.frame.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.frame.setFrameShadow(QtWidgets.QFrame.Raised)
        self.frame.setObjectName("frame")

        self.gridLayout_2.addWidget(self.frame, 0, 0, 1, 1)
        
        self.gridLayout.addWidget(self.widget, 0, 0, 1, 1)

        self.widget_2 = QtWidgets.QWidget(self.centralwidget)
        self.widget_2.setObjectName("widget_2")

        self.pushButton = QtWidgets.QPushButton(self.widget_2)
        self.pushButton.setGeometry(QtCore.QRect(30, 30, 113, 32))
        self.pushButton.setObjectName("pushButton")
#        self.pushButton.clicked.connect(self.addLabel)
        self.gridLayout.addWidget(self.widget_2, 0, 1, 1, 1)
        
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 1000, 22))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        MainWindow.setWindowTitle(self._translate("MainWindow", "MainWindow"))
        self.pushButton.setText(self._translate("MainWindow", "PushButton"))


class MainWindow(QMainWindow, Ui_MainWindow):                          # +
    def __init__(self):
        super().__init__()
        self.setupUi(self)  
        
        self.pushButton.clicked.connect(self.addLabel)
        self.label = QtWidgets.QLabel(self.frame)
        self.label.move(0, -15)
        self.frame.setStyleSheet('background-color: #ccffbd;')
        self.label.setStyleSheet('background-color: #346751; color: #fff;')
        
    def addLabel(self):
#        self.label = QtWidgets.QLabel(self.frame)
        self.label.setGeometry(
            QtCore.QRect(random.randint(1, 30), 
            random.randint(1, 30), 
            60, 
            16)
        )
        self.label.setText(
            f"Label: {self.label.geometry().x()}-{self.label.geometry().y()}"
        )


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    w = MainWindow()
    w.show()
    sys.exit(app.exec_())

введите сюда описание изображения


Update

мне нужно нажатием по кнопке плодить Qlabel, а не переопределять старый объект. Что бы при каждом нажатии создавался + еще один объект. 1,2,3,4,5...

import sys
import random
from PyQt5 import QtCore, QtGui, QtWidgets  
from PyQt5.Qt import *


class Ui_MainWindow(object):
    def __init__(self):
        self._translate = QtCore.QCoreApplication.translate

    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(1000, 600)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        
        self.gridLayout = QtWidgets.QGridLayout(self.centralwidget)
        self.gridLayout.setObjectName("gridLayout")
        
        self.widget = QtWidgets.QWidget(self.centralwidget)
        self.widget.setObjectName("widget")
        self.gridLayout_2 = QtWidgets.QGridLayout(self.widget)
        self.gridLayout_2.setObjectName("gridLayout_2")

        self.frame = QtWidgets.QFrame(self.widget)
        self.frame.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.frame.setFrameShadow(QtWidgets.QFrame.Raised)
        self.frame.setObjectName("frame")

        self.gridLayout_2.addWidget(self.frame, 0, 0, 1, 1)
        
        self.gridLayout.addWidget(self.widget, 0, 0, 1, 1)

        self.widget_2 = QtWidgets.QWidget(self.centralwidget)
        self.widget_2.setObjectName("widget_2")

        self.pushButton = QtWidgets.QPushButton(self.widget_2)
        self.pushButton.setGeometry(QtCore.QRect(30, 30, 113, 32))
        self.pushButton.setObjectName("pushButton")
#        self.pushButton.clicked.connect(self.addLabel)
        self.gridLayout.addWidget(self.widget_2, 0, 1, 1, 1)
        
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 1000, 22))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        MainWindow.setWindowTitle(self._translate("MainWindow", "MainWindow"))
        self.pushButton.setText(self._translate("MainWindow", "PushButton"))


class MainWindow(QMainWindow, Ui_MainWindow):                          # +
    def __init__(self):
        super().__init__()
        self.setupUi(self)  
        
        self.pushButton.clicked.connect(self.addLabel)
        self.frame.setStyleSheet('background-color: #ccffbd;')
        
    def addLabel(self):
        label = QtWidgets.QLabel(self.frame)
        label.setGeometry(
            QtCore.QRect(random.randint(1, 30), 
            random.randint(1, 30), 
            60, 
            16)
        )
        label.setText(
            f"Label: {label.geometry().x()}-{label.geometry().y()}"
        )
        label.setStyleSheet('color: #f00;')
        label.show()
        

if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    w = MainWindow()
    w.show()
    sys.exit(app.exec_())

введите сюда описание изображения

→ Ссылка