PySide:如何获得包含给定小部件的布局?

时间:2013-05-20 15:10:27

标签: python pyside

从给定的小部件中,是否可以获得包含它的布局?

我正在做一个动态表单,我的窗口小部件层次结构如下:

QDialogBox
|- QVBoxLayout
  |- QHBoxLayout 1
    |- Widget 1
    |- Widget 2
    |- ...
  |- QHBoxLayout 2
    |- Widget 1
    |- Widget 2
    |- ...
  |- ...

如果我收到来自Widget 1Widget 2的信号,我可以使用sender()功能识别它。我希望能够在同一行上调整其他小部件的某些属性。如何获得对包含给定小部件的QHBoxLayout的引用?

parent()属性为我提供QDialogBox,因为窗口小部件的父级不能是布局。 layout()属性为我提供None,因为它引用了包含的布局,而不是包含的布局。

1 个答案:

答案 0 :(得分:1)

在您的情况下,以下内容应该有效(我在类似的设置上进行了测试):

# starting from Widget_1 get a list of horizontal layouts contained by QVBoxLayout
# Widget_1.parent() returns the QDialogBox
# .layout() returns the containing QVBoxLayout
# children returns layouts in QVBoxLayout, including QHBoxLayout 1-N
# if you know that there are only QHBoxLayouts, you don't need to filter
hlayouts = [layout for layout in Widget_1.parent().layout().children()
            if type(layout) == PySide.QtGui.QHBoxLayout]

def layout_widgets(layout):
    """Get widgets contained in layout"""
    return [l.itemAt(i).widget() for i in range(layout.count())]

# then find hlayout containing Widget_1
my_layout = next((l for l in hlayouts if Widget_1 in layout_widgets(l)), None)

我正在使用next()来查找包含小部件的第一个布局(请参阅https://stackoverflow.com/a/2748753/532513)。为了更具可读性,您可以使用for循环,但next()更清晰。