1

ボタンにレイアウト (QLabels と QSpacer を含む) を設定しており、これを新しいものに置き換えたいと考えています。これを行うために、次のコードを作成しました。

while(!layout.isEmpty())
{
    delete(layout.takeAt(0));
}

この後、新しいレイアウトを設定しました:

layout.addWidget(...)
layout.addSpacer(...)
...
button.setLayout(layout)

残念ながら新しいレイアウトが設定されていますが、古いレイアウトはまだ見られます。これを解決するにはどうすればよいですか?

4

2 に答える 2

2

コメントに基づいて、レイアウトではなく、ウィジェット内のアイテムを削除したいと考えています。 QLayout::takeAtを返しますQLayoutItem*。したがって、ウィジェットのレイアウトをループしてレイアウト アイテムを削除しますが、レイアウト アイテムに追加されたウィジェットは削除しません。テストとして、代わりに次のことを試してください。

while(!layout.isEmpty())
{
    delete layout.itemAt(0)->widget();
    delete layout.takeAt(0);
}

しかし、これは私が良い長期設計と考えるものではありません。これが最善の方法である特殊なケースがいくつかあるかもしれませんが、ボタン内のウィジェットの配列全体を破棄して再作成するのではなく、スタックされたウィジェットまたは同様のものを使用して、提示されたウィジェットを前後に切り替えることを検討することをお勧めします. または、2 つの異なるボタンを考えて、ボタンの内容ではなく、ボタンだけを破棄して再挿入します。

于 2012-07-18T18:27:00.450 に答える
0

あなたはやってみることができます

delete button.layout();

新しいレイアウトを設定する前に。

または、ウィジェットなどを既存のレイアウトに追加することもできます (新しいレイアウトを設定する必要はありません)。

[編集] 古いレイアウトでポインターのみを使用する限り、これは機能するはずです。

QLayout* layout = button.layout();
while( !layout->isEmpty() )
{
    delete( layout->takeAt( 0 ) );
}

layout->addWidget(...)   
layout->addSpacer(...)
// do not call button.setLayout()

[編集2]これが更新の問題だけである場合は、試すことができます

button->update();
QApplication::processEvents( QEventLoop::IgnoreUserInputEvents );
于 2012-07-18T09:50:34.500 に答える