【问题标题】:Does Qt ObjectName() have to be unique?Qt ObjectName() 必须是唯一的吗?
【发布时间】:2014-10-14 15:13:09
【问题描述】:

标题中的简单问题 - 如果我在一个对象上调用setObjectName(),它是否必须是唯一的,还是只是因为约定而被推荐?我已经继承了QLabel,并希望自动为创建的对象命名;如果这是一个坏主意,我会找到一些设置随机唯一名称的方法。 (我实际上正在使用 PyQt,但这不应该影响答案!)

更新

为了回应到目前为止的 2 个答案(我应该已经预测到了!),我想这样做,以便我可以忽略我的子类的所有实例。调用findChildren(QLabel) 级联,以便还找到QLabel 的所有子类 - 如果我对所有子类对象使用相同的对象名称,那么我可以在findChildren() 的第二个参数中进行正则表达式,以便我忽略它们

【问题讨论】:

  • 不,它不必是唯一的,但建议这样做。当您按名称搜索某些项目或使用样式表时,这可能会出现问题。
  • QObject::findChildren 返回具有匹配名称的孩子的List,因此确实可能存在重复名称。

标签: qt pyqt


【解决方案1】:

如果您查看 QObject 的 documentation,您可以看到它声明:-

此属性保存此对象的名称。 您可以使用 findChild() 按名称(和类型)查找对象。您可以使用 findChildren() 找到一组对象。

看着findChildren(),它说:-

返回该对象的所有具有给定名称的子对象,可以将其强制转换为类型 T...

所以,很明显可以看出多个对象可以同名。

【讨论】:

    【解决方案2】:

    不,但如果没有唯一名称,您将无法按名称查找对象(无需额外检查)。

    【讨论】:

      【解决方案3】:

      设置对象名称不是必需的,它默认为空字符串。 但是,如果您需要按名称查找对象,您肯定希望它是唯一的!

      【讨论】:

        【解决方案4】:

        对象名称基本上不会在任何重要的地方使用。这取决于你如何设置它。有两点需要注意:

        1. 在uic生成的代码中setupUi函数创建的对象:所有对象都有名字,而且名字是唯一的。不过,这只是为了您的方便。

        2. 在对象上使用QMetaObject::connectSlotsByName 时,只要对象名为foo,所有名为on_foo_bar 的槽都将连接到子对象的bar 信号。

          李>
        3. 当对小部件使用 CSS 样式表(QWidget 类层次结构)时,对象名称可以用作 id 选择器中的 id。有时这很方便。

        【讨论】:

        • 如果你使用Qt CSS来设置对象样式,对象名可以用在选择器中,比较方便。
        猜你喜欢
        • 2012-05-12
        • 1970-01-01
        • 2011-05-18
        • 2017-09-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多