2

特定のウィジェットから、それを含むレイアウトを取得することは可能ですか?

私は動的フォームを作成していますが、ウィジェットの階層は次のようになります。

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

Widget 1またはから信号を受信した場合Widget 2、関数を使用して識別できsender()ます。同じ行にある他のウィジェットのいくつかのプロパティを調整できるようにしたいと思います。QHBoxLayout特定のウィジェットを含むへの参照を取得するにはどうすればよいですか?

parent()QDialogBoxウィジェットの親をレイアウトにすることはできないため、プロパティは私に を提供します。layout()プロパティはNone、含まれているレイアウトではなく、含まれているレイアウトを参照するため、私に与えます。

4

1 に答える 1

2

あなたの場合、以下が機能するはずです(同様の設定でテストしました):

# 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 [layout.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() の方がクリーンです。

于 2013-05-21T08:52:49.587 に答える