2013-05-20 7 views
1

주어진 위젯에서 해당 위젯을 포함하는 레이아웃을 가져올 수 있습니까?PySide : 주어진 위젯을 포함하는 레이아웃을 얻는 방법?

나는 역동적 인 형태를하고있어, 내 위젯 계층 구조는 다음과 같습니다

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

내가 Widget 1 또는 Widget 2에서 신호를 수신하면, 나는 sender() 기능을 사용하여 식별 할 수 있습니다. 동일한 줄에 다른 위젯의 일부 속성을 조정할 수 있기를 바랍니다. 주어진 위젯을 포함하는 QHBoxLayout에 대한 참조를 얻으려면 어떻게해야합니까?

parent() 속성은 위젯의 부모가 레이아웃이 될 수 없기 때문에 QDialogBox을 제공합니다. layout() 속성은 포함 된 레이아웃이 아니라 포함하는 레이아웃을 참조하기 때문에 None을 제공합니다. 귀하의 경우에는

답변

1

, 다음 (내가 비슷한 설정 테스트) 작동합니다 : 나는 당신의 위젯 (https://stackoverflow.com/a/2748753/532513 참조)를 포함하는 첫 번째 레이아웃을 찾기 위해 다음() 사용하고

# 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) 

. 가독성을 높이기 위해 for 루프를 사용할 수 있지만 next()는 더 깨끗합니다.

+0

예, 비슷한 일을 끝냈습니다. 그러나 모든 레이아웃 항목을 반복하는 것보다 더 좋은 방법이 있을지 궁금합니다. –

관련 문제