Не отображается динамически созданный элемент 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_())

