19

私のアプリでは、QSplitter で分割されたウィンドウがあり、ウィジェットを削除する必要があります。

どうやってやるの?便利なメソッドが見つかりません

4

6 に答える 6

23

ウィジェットを保存して別の場所に配置するのか、それともウィジェットを破棄するのかは、私にはわかりません。

  • ウィジェットの破棄:ウィジェットへのポインターを取得できる場合は、ウィジェットを削除するだけです。スプリッターは、その子が削除されていることを安全に通知され、それ自体から削除されます。

  • ウィジェットの保持:ウィジェットへのポインターを取得すると、その親を他のウィジェットに設定し、それを別のウィジェットのレイアウトに追加するだけで、そこに表示されます。子の1つが親に変更されていることがQSplitterに通知されるため、これは安全です。

親をNULLに設定する場合(cjhuittの回答)、ウィジェットには親がなくなったため、そのメモリをクリーンアップする必要があることに注意してください。

于 2008-12-19T07:17:49.927 に答える
17

Qt の多くのものは、「伝統的に」削除できません。代わりに hide() を呼び出して破棄してください。QSplitter のドキュメントから:

子を hide() すると、そのスペースが他の子に分配されます。再度 show() すると元に戻ります。

于 2008-12-16T15:26:40.863 に答える
2

私はツミノイドの答えが好きです。ただし、絶対に削除する必要がある場合は、削除するウィジェットを取得して、setParent( NULL )そのウィジェットを呼び出してみてください。それが私の最善の推測です。

于 2008-12-16T15:33:46.153 に答える
1

ウィジェットへのポインターを保持している場合は、それを削除するか、安全を確保したい場合は deleteLater() を使用します。

ウィジェット ポインターがない場合は、QSplitter::widget(int index) 関数を使用します。次に、その deleteLater() スロットを呼び出すことができます。

ウィジェット インデックスを持っていないが、ウィジェット objectName() を知っている場合、QObject::findChild() がウィジェット ポインタを取得する唯一の方法です。

于 2009-03-07T23:28:35.693 に答える
0

私は同じ問題に遭遇しました。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);
}
于 2013-06-19T16:06:39.623 に答える
-1

子ウィジェットが削除されないようにするもう 1 つの簡単な方法は、QSplitter.takeWidget(child) を使用することです。これは、スプリッターからウィジェットを削除するための推奨される方法でもあります。(Qt ドキュメント)

于 2010-08-04T13:44:20.370 に答える