2013-05-20 4 views
1

Из данного виджета можно ли получить макет, содержащий его?PySide: Как получить макет, содержащий данный виджет?

Я делаю динамичную форму, и моя иерархия виджетов выглядит следующим образом:

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

Если я получаю сигнал от Widget 1 или Widget 2, я могу определить его с помощью sender() функции. Я хотел бы настроить некоторые свойства других виджетов в одной строке. Как я могу получить ссылку на QHBoxLayout, содержащий данный виджет?

parent() property дает мне QDialogBox, так как родительский виджет не может быть макетом. layout() свойство дает мне None, так как это относится к содержащемуся макету, а не к содержащему макету.

ответ

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) 

Я использую следующий(), чтобы найти первый макет, содержащий виджет (см https://stackoverflow.com/a/2748753/532513). Для большей читаемости вы можете использовать цикл for, но next() является более чистым.

+0

Да, я закончил делать что-то подобное. Но мне было интересно, будет ли лучший способ, чем перебирать все элементы макета. –

Смежные вопросы