如何在pyqt中获取小部件列表?

How to get list of widgets in pyqt?

我正在使用 QtDesigner 设计界面并使用 PyQt 编辑其功能。我创建的一个小部件有几个按钮,我希望它们都具有 属性 Checkable = True。

所以目前我正在做的是:

class MyWidget(QWidget):
    def __init__(self):
        super(MyWidget, self).__init__()
        uic.loadUi('./my_widget.ui', self)
        self.pushButton_X.setCheckable(True)
        self.pushButton_Y.setCheckable(True)
        self.pushButton_Z.setCheckable(True)
        self.pushButton_ETC.setCheckable(True)
        self.show()

有什么方法可以做类似的事情:

pushbuttons_list = self.get_all_pushbuttons()
for i in pushbuttons_list:
    i.setCheckable(True)

?

我正在尝试 this question 的答案,但我不断得到

>  File "./testing_class.py", line 12, in __init__
    items = (self.layout.itemAt(i) for i in range(self.layout.count())) 
AttributeError: 'builtin_function_or_method' object has no attribute 'count'

您的示例失败,因为所有 Qt properties 都可以通过 调用 属性访问(请参阅用于 self.layout() 的括号):

items = (self.layout().itemAt(i) for i in range(self.layout().count()))

请注意,这将只能访问 布局项,而不是它们可能包含(或可能不包含)的小部件。为此,使用理解只会使事情不必要地复杂化,因为 one-liners 应该只在保持代码可读性的情况下使用;上面的理解已经足够复杂了,因为无论如何你都需要循环遍历所有项目,所以它没什么用处。只需使用一个 for 循环,它更具可读性:

for i in range(self.layout().count()):
    widget = self.layout().itemAt(i).widget()
    if isinstance(widget, QPushButton):
        widget.setCheckable(True)

请注意,如果您有多个按钮需要检查,而您这样做只是为了避免为所有按钮手动设置可检查 属性,您可以只使用扩展的 selection所有 UI 元素通用的模式允许在单击多个对象时按住 Ctrl selection。
属性 编辑器将自动显示 selected 小部件的所有通用属性,并将更改的 属性 应用到所有这些小部件。


另一种选择是使用 findChildren():

for button in self.findChildren(QPushButton, Qt.FindDirectChildrenOnly):
    button.setCheckable(True)

只要您的复杂布局具有包含其他按钮的嵌套小部件,就需要 Qt.FindDirectChildrenOnly 标志,如果您删除它,您会发现 any 按钮存在于内部window(或引用为 self 的小部件)。


最后,按钮可以是 QButtonGroup 的一部分,也可以在 Designer 中创建。仅 select 所有按钮(如上所述),右键单击其中一个按钮并 select“分配给按钮组”,然后:

for button in self.buttonGroup.buttons():
    button.setCheckable(True)

注意上面的self.buttonGroup是Designer分配的对象名称,如果你改变它或者你创建了多个,确保引用匹配它。