在PyQt布局中循环遍历小部件

wro*_*ans 11 python pyqt

我的问题与在PyQT中获取布局的小部件有些相关,但它并不重复.我没有寻找关于如何做到这一点的高层战略观点,而是试图了解最惯用和最简单的方法.由于PyQt是Qt C++ API的一个非常精确的绑定,它提供了一种C-ish方法来获取布局中的小部件.这是我一直在使用的那种习语:

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())
Run Code Online (Sandbox Code Playgroud)

我不是最有经验的Python人,但这似乎有点不合情理.我的直觉告诉我,在理想世界中,Python代码看起来应该更像:

for w in layout.widgets():
  doSomething(w)
Run Code Online (Sandbox Code Playgroud)

我错了吗?我错过了一个优秀的成语吗?这是在PyQt中迭代小部件的最佳方法吗?我倾向于用C++思考,所以我有时会错过"明显的"Python语言功能,这会使事情变得更好.我正在做的部分是递归下降到小部件,其布局包含带有布局的小部件(等等),以便在运行时自动将连接连接到在Designer中创建的UI.添加QTabWidgets,并处理设计器中设置的动态属性,我的代码基本上可以工作,但它只是感觉非常笨重.

Pau*_*aul 16

这是一个非常晚的反应,但我认为它可能对未来的反抗有用.我也在寻找这个问题的答案.但我想识别小部件类型,以便我可以相应地处理它们.这是我发现的示例代码:

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())
Run Code Online (Sandbox Code Playgroud)

我希望有一天这对某人有用.:)


goe*_*tor 7

您可以将小部件放入生成器中,如下所示:

items = (layout.itemAt(i) for i in range(layout.count())) 
for w in items:
   doSomething(w)
Run Code Online (Sandbox Code Playgroud)

如果您最终使用了很多,您可以将该代码插入生成器函数:

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


for w in layout_widgets(layout):
   doSomething(w)
Run Code Online (Sandbox Code Playgroud)


lsh*_*eng 5

只是评论,

items = (layout.itemAt(i) for i in range(layout.count())) 
for w in items:
   doSomething(w)
Run Code Online (Sandbox Code Playgroud)

我尝试了第一个答案,但我发现它返回一个WidgetItem类型,所以实际上我做了一个修订:

widgets = (layout.itemAt(i).widget() for i in range(layout.count())) 
for widget 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())
Run Code Online (Sandbox Code Playgroud)