【发布时间】:2011-03-01 03:29:27
【问题描述】:
我的问题与Get a layout's widgets in PyQT 有点相关,但不是重复的。我没有寻找如何做到这一点的高级战略观点,而是试图了解最惯用和最直接的方法是什么。由于 PyQt 是 Qt C++ API 的一个非常精确的绑定,它提供了一种 C 风格的方式来获取布局中的小部件。这是我一直在使用的那种成语:
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 人,但这似乎有点不合 Python。我的直觉告诉我,在理想世界中,Python 代码应该看起来更像:
for w in layout.widgets():
doSomething(w)
我错了吗?我错过了一个高级成语吗?这是在 PyQt 中迭代小部件的最佳方法吗?我倾向于用 C++ 来思考,所以我有时会错过让事情变得更好的“显而易见”的 Python 语言特性。我正在做的部分工作是递归地下降到带有布局的小部件(带有带有布局的小部件(等等)),以在运行时自动连接到在 Designer 中制作的 UI。添加QTabWidgets,处理设计器中设置的动态属性,我的代码基本可以工作了,但是感觉很笨拙。
【问题讨论】:
-
我只是想确保您知道您可以直接从您的 ui 实例访问所有小部件。您可以在您的 ui 实例上使用 dir() 来枚举您的 ui 中的所有对象(但这也会给您带来像 class 和 eq 这样的笨拙,但这很容易被过滤掉)。