擅长:python、mysql、java
<p>代码的问题是<code>QLayout.itemAt()</code>返回<code>QLayoutItem</code>、<code>QWidgetItem</code>或<code>QSpacerItem</code>,具体取决于该位置的项。所以情况是:</p>
<pre class="lang-py prettyprint-override"><code>type(layout.itemAt(i)) == QtGui.QHBoxLayout
</code></pre>
<p>永远不会是<code>True</code>,您将尝试为<code>QLayoutItem</code>执行<code>.widget()</code>,并返回<code>None</code>。所以你得到的错误。另一件事是,你需要向后循环。因为从一开始删除东西会改变项目的顺序。</p>
<p>您需要这样编写函数:</p>
<pre class="lang-py prettyprint-override"><code>def clearLayout(self, layout):
for i in reversed(range(layout.count())):
item = layout.itemAt(i)
if isinstance(item, QtGui.QWidgetItem):
print "widget" + str(item)
item.widget().close()
# or
# item.widget().setParent(None)
elif isinstance(item, QtGui.QSpacerItem):
print "spacer " + str(item)
# no need to do extra stuff
else:
print "layout " + str(item)
self.clearLayout(item.layout())
# remove the item from layout
layout.removeItem(item)
</code></pre>