You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PyQt5动态添加控件时设置objectName后无法通过名称访问如何解决

问题原因
  1. setObjectName("name")是Qt控件的内置属性设置,仅用于Qt体系内的控件识别(比如样式表匹配、findChild查找等),不会自动给Python类的self实例新增name属性。你直接调用self.name本质是访问不存在的实例属性,会直接触发AttributeError导致崩溃。
  2. 你给QLabel设置文本的写法也错误:self.label.text = "L"是把QLabel内置的text()获取文本的方法直接覆盖成了字符串,后续就算正确拿到控件实例调用text()方法也会报错。
  3. 每次新增控件都赋值给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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 20:54:04