PyQt5如何在QComboBox选中对应选项后动态生成文本框或展示图片
PyQt5 QComboBox动态生成控件问题解决方案
问题原因
- 动态实例化QLineEdit、QLabel控件后未调用
show()方法,控件不会被渲染到窗口 - 展示图片的QLabel未绑定父容器,也没有设置显示位置,默认不会在当前主窗口展示
- 未处理切换选项时旧控件的状态,多次切换会导致多个控件堆叠在窗口中
修正后完整代码
import sys from PyQt5.QtWidgets import * from PyQt5.QtGui import * class Example(QMainWindow): def __init__(self): super().__init__() # 提前声明控件属性,方便后续切换管理 self.line = None self.img_label = None combo = QComboBox(self) combo.addItem("textbox") combo.addItem("image") combo.move(50, 50) self.qlabel = QLabel(self) self.qlabel.move(50,16) combo.activated[str].connect(self.onChanged) self.setGeometry(50,50,320,200) self.setWindowTitle("Programme") self.show() def onChanged(self, text): # 切换前先隐藏之前生成的控件 if self.line: self.line.hide() if self.img_label: self.img_label.hide() if text == 'textbox': # 控件只初始化一次,避免重复创建 if not self.line: self.line = QLineEdit(self) self.line.move(50, 100) self.line.resize(200, 30) self.line.show() if text == 'image': if not self.img_label: self.img_label = QLabel(self) self.img_label.move(50, 100) # 可根据需要设置图片缩放 self.img_label.setScaledContents(True) self.img_label.resize(200, 80) self.im = QPixmap("image.jpg") self.img_label.setPixmap(self.im) self.img_label.show() if __name__ == '__main__': app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_())
修改说明
- 在
__init__中提前声明控件属性,避免重复实例化控件,也方便切换时统一管理 - 每次触发切换事件时,先隐藏已有的动态控件,避免出现堆叠
- 给所有动态控件设置了显示位置和大小,调用
show()方法完成渲染 - 图片控件绑定了父容器为当前主窗口,且开启了
setScaledContents适配控件大小显示图片
注意:请确保image.jpg和代码文件在同一目录下,否则图片无法正常加载
内容的提问来源于stack exchange,提问作者Jin
相关产品推荐
相关产品推荐

