2011-03-01 6 views
4

내 질문은 다소 Get a layout's widgets in PyQT과 관련이 있지만 중복이 아닙니다. 그것을하는 방법에 대한 높은 수준의 전략적 견해를 찾는 대신, 나는 그것을하는 가장 관용적이고 직접적인 방법이 무엇인지 이해하려고 노력하고 있습니다. PyQt는 Qt C++ API의 정확한 바인딩이기 때문에 레이아웃에서 위젯을 얻을 수있는 C-ish 방법을 제시합니다. 여기에 사용 된 관용구의 일종이다 :PyQt 레이아웃 위젯 위로 반복

for i in range(layout.count()): 
    item = layout.itemAt(i) 
    if type(item) == QtGui.QLayoutItem: 
    doSomeStuff(item.layout()) 
    if type(item) == QtGui.QWidgetItem: 
doSomething(item.widget()) 

내가 가장 경험 파이썬 사람이 아니에요,하지만이 다소 unpythonic 보인다. 내 직관은 이상적인 세계에서 파이썬 코드는 다음과 같이 보일 것이라고 말합니다.

for w in layout.widgets(): 
    doSomething(w) 

내가 잘못 했습니까? 우수한 관용구가 빠졌습니까? 이것이 PyQt의 위젯을 반복하는 가장 좋은 방법일까요? 저는 C++로 생각하는 경향이 있습니다. 그래서 때때로 일을 더 잘하는 "명백한"파이썬 언어 기능을 놓치기도합니다. 내가하고있는 일 중 일부는 런타임에 디자이너에서 만든 UI에 대한 연결을 자동으로 연결하는 레이아웃이있는 위젯이있는 레이아웃이 포함 된 위젯으로 재귀 적으로 내림차순으로 포함됩니다. QTabWidgets을 추가하고 디자이너에서 설정 한 동적 속성을 처리하면 기본적으로 내 코드가 작동하지만 끔찍한 느낌이 들게됩니다.

+0

난 그냥 만들고 싶어 : :) 나는 수정을했다 그래서 사실, 그냥 코멘트 – goertzenator

답변

5

당신과 같이 발전기에 위젯을 넣어 수 :

items = (layout.itemAt(i) for i in range(layout.count())) 
for w in items: 
    doSomething(w) 

을 당신이 것을 사용하게하는 경우

def layout_widgets(layout): 
    return (layout.itemAt(i) for i in range(layout.count())) 


for w in layout_widgets(layout): 
    doSomething(w) 
0

저는이 문제에 대한 가장 간단한 해결책이 있다고 생각합니다. PyQt (및 PySide)는 대부분 C++ API를 감싸는 래퍼입니다. 그들은 시그널/슬롯, QString과 같은 기본 타입과 같은 몇몇 영역에서 더 많은 파이썬 지원을 추가합니다.하지만 대부분은 C++ API에서와 똑같습니다. 이 자신보다 파이썬 라이브러리를 만들기에서 당신을 막을 필요가 없다 물론

..

11

이 매우 늦게 반응이다 그러나 나는 미래 refence에 유용 할 수 있습니다 생각 : 많은, 당신은 발전기 기능에 해당 코드를 양말 수 있습니다. 나는이 질문에 대한 답을 찾고 있었다. 그러나 위젯 유형을 식별하여 적절하게 처리 할 수 ​​있기를 원했습니다. 다음은 내가 발견 한 코드 예입니다.

for widget in centralwidget.children(): 
    if isinstance(widget, QLineEdit): 
     print "linedit: %s - %s" %(widget.objectName(),widget.text()) 

    if isinstance(widget, QCheckBox): 
     print "checkBox: %s - %s" %(widget.objectName(),widget.checkState()) 

언젠가는 누군가에게 유용하게되기를 바랍니다.

widgets = (layout.itemAt(i).widget() for i in range(layout.count())) 
for w in widgets: 
    if isinstance(widget, QLineEdit): 
     print "linedit: %s - %s" %(widget.objectName(),widget.text()) 
    if isinstance(widget, QCheckBox): 
     print "checkBox: %s - %s" %(widget.objectName(),widget.checkState()) 
1

items = (layout.itemAt(i) for i in range(layout.count())) 
for w in items: 
    doSomething(w) 

나는 첫 번째 대답을 시도했지만 나는 그것이 WidgetItem 유형을 반환 발견 ui 인스턴스에서 직접 모든 위젯을 사용할 수 있다는 것을 알고 있어야합니다. ui 인스턴스에서 dir()을 사용하여 UI의 모든 객체를 열거 할 수 있습니다 (그러나 이것 또한 __class__ 및 __eq__와 같은 cruft를 제공하지만 쉽게 필터링됩니다).