【问题标题】:PyQt5: How to assign ObjectName to all Objects with setObjectName [duplicate]PyQt5:如何使用 setObjectName 将 ObjectName 分配给所有对象 [重复]
【发布时间】:2019-11-26 09:46:01
【问题描述】:

如何为我的 gui 类中的所有 QWidget、QLayout、QFrame 等分配 ObjectName? 像这样的代码只适用于 PyQt4:

for w in gui.widgets():
   w.setObjectName(str(w)

这在 PyQt5 中是如何工作的?另外,我如何迭代所有对象而不是“只是”小部件?我知道对于 C++ 的这个问题有一些答案,但是我无法将它们翻译成 python。

【问题讨论】:

  • 首先,我强烈建议您不要使用小部件(或重要的对象)的字符串表示形式作为对象名称。也就是说,what 在您的情况下不起作用?你有错误吗?
  • 我得到的错误是:gui object has no attribute widgets.
  • 我发现这以某种方式节省了一些代码行:some_widget = QSomeWidget(..., objectName='button1', ...) 但没有完全回答我自己的问题。
  • 如果您向我们提供minimal, reproducible example 也会有很大帮助。
  • 据我所知,widgets() 函数在任何 QObject 或 QWidget 类中都不存在。您是否有可能在旧代码中实现并忘记更新它?或者,也许您使用了搜索/替换其他东西,从而重命名了该函数?

标签: pyqt5 objectname


【解决方案1】:

主要的 QObject 或 QWidget 类没有 widget() 函数,因此您可能在自己的代码中实现并且在更新 PyQt5 时忘记更新它。

要访问所有子对象,只需使用findChildrenQObject 作为第一个参数,这将返回QObject 类的所有后代,包括QWidgets、QActions、项目模型等:

for child in self.findChildren(QObject):
    pass

由于findChildren默认递归查找,你也可以限制为当前对象的直接子对象:

for child in self.findChildren(QObject, options=FindDirectChildrenOnly):
    pass

在这种情况下,结果将与self.children() 相同。

请注意,并非 Qt 中的所有类都继承自 QObject。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-10
    • 1970-01-01
    • 2021-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-03
    • 2013-10-27
    • 2014-10-19
    相关资源
    最近更新 更多