PyQt窗口渲染问题:调用show()后新增组件无法显示
PyQt6窗口显示后添加控件不显示的问题解决
问题核心:你在__init__方法中提前调用了self.show(),此时窗口已经完成首次渲染,后续创建的QLabel虽然设置了父窗口,但Qt不会自动触发窗口重新渲染,导致新控件无法显示。
解决方法
方法1:规范初始化流程(推荐)
将self.show()移到所有控件创建和配置完成之后,确保窗口显示前所有子控件都已准备就绪,Qt会一次性渲染所有控件。
修正后的代码:
from PyQt6.QtWidgets import QApplication, QWidget, QLabel import sys class MyGui(QWidget): box = {} def __init__(self) -> None: super().__init__() self.setFixedSize(200, 400) self.setStyleSheet("background-color:#000000") self.box["top"] = QLabel(self) self.box["top"].setFixedSize(200, 200) self.box["top"].setStyleSheet("background-color:red") self.box["top"].move(0,0) # 先完成所有控件初始化,再调用show() self.box["botom"] = QLabel(self) self.box["botom"].setFixedSize(200, 200) self.box["botom"].setStyleSheet("background-color:green") self.box["botom"].move(0,200) self.show() if __name__ == "__main__": app = QApplication(sys.argv) my_app = MyGui() try: sys.exit(app.exec()) except SystemExit: print("Closing window..")
方法2:动态添加后触发重绘
如果确实需要在窗口显示后动态添加控件,在创建并配置好新控件后,调用以下任一方法触发窗口重绘:
- 调用新控件的
show()方法:self.box["botom"].show() - 调用窗口的
update()方法:self.update()
示例代码(保留提前show()的情况):
from PyQt6.QtWidgets import QApplication, QWidget, QLabel import sys class MyGui(QWidget): box = {} def __init__(self) -> None: super().__init__() self.setFixedSize(200, 400) self.setStyleSheet("background-color:#000000") self.box["top"] = QLabel(self) self.box["top"].setFixedSize(200, 200) self.box["top"].setStyleSheet("background-color:red") self.box["top"].move(0,0) self.show() self.box["botom"] = QLabel(self) self.box["botom"].setFixedSize(200, 200) self.box["botom"].setStyleSheet("background-color:green") self.box["botom"].move(0,200) # 触发重绘,显示新控件 self.box["botom"].show() # 或者用 self.update() if __name__ == "__main__": app = QApplication(sys.argv) my_app = MyGui() try: sys.exit(app.exec()) except SystemExit: print("Closing window..")
效果对比
调用self.show()提前时的效果:
未提前调用self.show()时的效果:
内容的提问来源于stack exchange,提问作者Daniel Šebík
相关产品推荐
相关产品推荐

