如何在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分配的对象名称,如果你改变它或者你创建了多个,确保引用匹配它。
我正在使用 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分配的对象名称,如果你改变它或者你创建了多个,确保引用匹配它。