私のアプリでは、QSplitter で分割されたウィンドウがあり、ウィジェットを削除する必要があります。
どうやってやるの?便利なメソッドが見つかりません
ウィジェットを保存して別の場所に配置するのか、それともウィジェットを破棄するのかは、私にはわかりません。
ウィジェットの破棄:ウィジェットへのポインターを取得できる場合は、ウィジェットを削除するだけです。スプリッターは、その子が削除されていることを安全に通知され、それ自体から削除されます。
ウィジェットの保持:ウィジェットへのポインターを取得すると、その親を他のウィジェットに設定し、それを別のウィジェットのレイアウトに追加するだけで、そこに表示されます。子の1つが親に変更されていることがQSplitterに通知されるため、これは安全です。
親をNULLに設定する場合(cjhuittの回答)、ウィジェットには親がなくなったため、そのメモリをクリーンアップする必要があることに注意してください。
Qt の多くのものは、「伝統的に」削除できません。代わりに hide() を呼び出して破棄してください。QSplitter のドキュメントから:
子を hide() すると、そのスペースが他の子に分配されます。再度 show() すると元に戻ります。
私はツミノイドの答えが好きです。ただし、絶対に削除する必要がある場合は、削除するウィジェットを取得して、setParent( NULL )
そのウィジェットを呼び出してみてください。それが私の最善の推測です。
ウィジェットへのポインターを保持している場合は、それを削除するか、安全を確保したい場合は deleteLater() を使用します。
ウィジェット ポインターがない場合は、QSplitter::widget(int index) 関数を使用します。次に、その deleteLater() スロットを呼び出すことができます。
ウィジェット インデックスを持っていないが、ウィジェット objectName() を知っている場合、QObject::findChild() がウィジェット ポインタを取得する唯一の方法です。
私は同じ問題に遭遇しました。Qt 4.8 では、QSplitter のウィジェットの 1 つを一時的に非表示にするには、単純に非表示にします。ただし、スプリッター ハンドルは引き続き移動できるため、十分ではありません。ただし、ハンドルにアクセスして非表示にすることもできます。
frameA->setVisible(conditionA);
frameB->setVisible(conditionB);
if ( !(conditionA && conditionB) ) // if only 1 frame is visible
{
splitter->handle(0)->setVisible(false);
}
子ウィジェットが削除されないようにするもう 1 つの簡単な方法は、QSplitter.takeWidget(child) を使用することです。これは、スプリッターからウィジェットを削除するための推奨される方法でもあります。(Qt ドキュメント)