PyQt5动态添加控件时设置objectName后无法通过名称访问如何解决
问题原因
setObjectName("name")是Qt控件的内置属性设置,仅用于Qt体系内的控件识别(比如样式表匹配、findChild查找等),不会自动给Python类的self实例新增name属性。你直接调用self.name本质是访问不存在的实例属性,会直接触发AttributeError导致崩溃。- 你给QLabel设置文本的写法也错误:
self.label.text = "L"是把QLabel内置的text()获取文本的方法直接覆盖成了字符串,后续就算正确拿到控件实例调用text()方法也会报错。 - 每次新增控件都赋值给
self.label会导致之前的控件引用被覆盖,无法单独管理多个动态添加的食物控件。
修正代码
你要获取刚添加的标签文本,直接用你创建的控件实例即可,不需要通过对象名访问:
def add(self): h1 = QHBoxLayout() # 不需要存到self,局部变量就能用,要存多个可以用self.labels = []这类列表存 food_label = QLabel() food_label.setObjectName("name") # 正确设置文本用setText方法 food_label.setText("L") h1.addWidget(food_label) h1.addWidget(QLabel('Weight')) h2 = QHBoxLayout() h2.addWidget(QLineEdit()) h2.addWidget(QLineEdit()) i = self.verticalLayout_2.count() self.verticalLayout_2.insertLayout(i - 2, h1) self.verticalLayout_2.insertLayout(i - 1, h2) # 直接用当前创建的实例获取文本 print(food_label.text())
如果你后续需要在其他方法里通过对象名查找对应控件,可以用Qt提供的查找方法:
# 查找单个名为name的QLabel控件 target_label = self.findChild(QLabel, "name") # 查找所有名为name的QLabel控件(适合多个动态添加的场景) all_food_labels = self.findChildren(QLabel, "name")
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

