【问题标题】:Why are Qt layouts children of it's widget?为什么 Qt 布局是它的小部件的子级?
【发布时间】:2025-11-24 03:10:01
【问题描述】:

在使用 Qt 应用程序时,如果我创建一个 Widget 作为根并具有与 Widget 关联的 QHboxLayout,当我将 Widgets 添加到布局中时,在 Widget(根)上调用 children() 将返回一个列表它是子 Widget,包括附加到 Widget 的布局对象。在阅读 Qt 布局的 documentation 时,布局被描述为应该与 QWidget 相关联的东西,而不是 QWidget 的子项,因为它可以设置为调用 setLayout。布局未渲染,但布局有父级。布局负责帮助孩子调整 QWidget 的大小。

我的问题是,为什么 Qlayout 会有一个父级,它的用途是什么?为什么布局会作为 QWidget 的子级返回,我在 Widget 上调用 children()?,我会从不希望返回布局,我希望只返回小部件,因为它实际上没有被渲染,不像小部件,但目的是帮助渲染小部件调整大小。

【问题讨论】:

    标签: qt


    【解决方案1】:

    QWidget和QLayout是QObject,QObject之间可以有亲缘关系the docs指出:

    QObjects 在对象树中组织自己。当你创建一个 QObject 以另一个对象为父对象,该对象会自动 将自己添加到父级的 children() 列表中。父母取得所有权 对象的;即,它将自动删除其子项 析构函数。您可以按名称查找对象,也可以选择键入 使用 findChild() 或 findChildren()。

    正如它所指出的,主要功能是在父级被销毁时释放子级的内存,在 C++ 中避免内存泄漏很重要,这同样适用于 Python 绑定。

    所以布局是小部件的儿子,所以当小部件被销毁时,布局也被销毁。

    如果要获取子小部件,必须使用QObject::findChildren() 方法:

    c++

    QList<QWidget *> childrens = widget.findChildren<QWidget *>(Qt::FindDirectChildrenOnly);
    

    蟒蛇

    childrens = widget.findChildren(QtWidgets.QWidget, QtCore.Qt.FindDirectChildrenOnly)
    

    注意:如果你想递归访问孩子的孩子,那么你必须将Qt::FindDirectChildrenOnly改为Qt::FindChildrenRecursively

    【讨论】:

    • findChildren 有点过于通用,并且在 SpinButtons 内返回 QLineEdit。其余的答案都很好。
    • @user12388651 我认为您的情况没有必要使用该方法。为什么不创建一个QList&lt;QLineEdit *&gt; 来存储创建的 QLineEdits?这样您就可以轻松访问。