オプションを切り替えると変化するウィジェットがあります。これにより、すべてのレイアウトとウィジェットが無効になります。すべてのレイアウトのリストを保持しているので、この回答に似たものを使用してそれらを削除できます:
class MyWidget(QFrame):
# ...
def reLayout(self):
def deleteLayoutChilds(l):
while l.count():
item=l.takeAt(0)
widget=item.widget()
if widget: widget.deleteLater()
else: deleteLayoutChilds(item.layout())
for l in self.allLayouts: deleteLayoutChilds(l)
# now install the new layout
##
## how to delete the old layout first?
l=self.layout(); del l # no effect
#
layout=QGridLayout(self)
## warning: QLayout: Attempting to add QLayout "" to MyWidget "", which already has a layout.
古いレイアウトを削除して新しいレイアウトを設定するにはどうすればよいですか?
ドキュメントは非常に簡潔で、Python には直接適用できないようです。
QWidget.setLayout (自己、QLayout)
QLayout 引数の所有権は Qt に譲渡されます。
このウィジェットのレイアウト マネージャーをレイアウトに設定します。
このウィジェットに既にレイアウト マネージャーがインストールされている場合、QWidget は別のインストールを許可しません。新しいレイアウトで setLayout() を呼び出す前に、まず既存のレイアウト マネージャー (layout() によって返される) を削除する必要があります。
layout が別のウィジェットのレイアウト マネージャーである場合、setLayout() はレイアウトの親を変更し、このウィジェットのレイアウト マネージャーにします。
例:
QVBoxLayout *layout = new QVBoxLayout; layout->addWidget(formWidget); setLayout(layout);
この関数を呼び出す代わりに、このウィジェットをレイアウトのコンストラクターに渡すこともできます。
QWidget はレイアウトの所有権を取得します。
layout() およびレイアウト管理も参照してください。