如何访问 QWidget 中的 QPushButton 对象?

How to access a QPushButton object inside a QWidget?

例如下面的代码:

>>> from PyQt5.QtWidgets import *
>>> import sys
>>> app = QApplication(sys.argv)
>>> widget = QWidget()
>>> layout = QVBoxLayout()
>>> push_button = QPushButton("Hello")
>>> layout.addWidget(push_button)
>>> widget.setLayout(layout)
>>> push_button
<PyQt5.QtWidgets.QPushButton object at 0x7f52d2427700>
>>> 

我想从小部件对象访问 <PyQt5.QtWidgets.QPushButton object at 0x7f52d2427700>。可能吗?

将小部件添加到布局后,它们将自动 re-parented 到随后包含该布局的小部件。这意味着您可以使用 findChild 来获取对给定根小部件下的对象树中的任何子项的引用。如果您为目标对象命名,效果最佳:

>>> push_button.setObjectName('btn_hello')
>>> widget.findChild(QPushButton, 'btn_hello').text()
'Hello'

如果目标对象没有名称,findChildren也可用于搜索相同类型的后代对象:

>>> for button in widget.findChildren(QPushButton):
...     if button.text() == 'Hello':
...         print(button)
...         break
...
<PyQt5.QtWidgets.QPushButton object at 0x7fa0e089bb50>

查找方法默认递归搜索,但也可以将搜索限制为仅直接子项(返回的列表按照子项添加到父项的顺序):

>>> for text in 'One Two Three'.split():
...     layout.addWidget(QPushButton(text))
...
>>> widget.findChildren(QPushButton, options=Qt.FindDirectChildrenOnly)[1].text()
'One'

要搜索不同类型的子对象,可以使用类型元组:

>>> for text in 'Red Blue Green'.split():
...     layout.addWidget(QLabel(text))
...
>>> widget.findChildren((QLabel, QPushButton))[4].text()
'Red'