2011-03-01 76 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()) 

我不是最有經驗的Python的傢伙,但這似乎有點unpythonic。我的直覺告訴我,在理想的世界中,Python代碼應該看起來更像:

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

我錯了嗎?我錯過了一個優越的成語嗎?這是在PyQt中迭代小部件的最佳方式嗎?我傾向於用C++思考,所以我有時會錯過「明顯」的Python語言特性,這些特性使事情變得更好。我正在做的一部分是遞歸地下降到具有佈局的小部件的佈局(等等),以自動連接到運行時在Designer中創建的UI的連接。添加QTabWidgets,並處理在設計器中設置的動態屬性,我的代碼基本上可以工作,但它感覺非常笨拙。

+0

我只是想確定你知道你可以直接從你的UI實例獲得所有的小部件。你可以在你的UI實例上使用dir()來枚舉你的UI中的所有對象(但是這也會讓你像__class__和__eq__一樣被刪除,但這很容易被濾掉)。 – goertzenator 2011-03-04 15:22:03

回答

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的包裝器。他們確實在一些領域增加了更多pythonic支持 - 信號/插槽,基本類型,如QString等,但大多數情況下,所有內容都與C++ API完全相同。

當然,這並不能阻止使自己更Python庫停止你..

11

這是一個非常晚的反應,但我認爲它可能對未來的反應有用。我也在尋找這個問題的答案。但我想識別小部件類型,所以我可以相應地處理它們。這裏是我發現的示例代碼:

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

我希望那對某個人有一天會有用。 :)

1

只是一個評論,

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

我嘗試的第一個答案,但我發現,它返回一個WidgetItem類型,所以實際上我做了修訂:

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