6

レイアウトにウィジェットを追加しています

ui->horizontalLayout->addWidget(tabwidget);

qmainwindowはそれ自体のサイズを変更します。しかし、私はします

tabwidget->setVisible(false);
qs = sizeHint();
resize(qs);

tabwidgetがウィンドウから削除されなかったようなサイズになります。

新しいボタンを作りました

void MainWindow::on_pushButton_2_clicked()
{
    qs = sizeHint();
    resize(qs);
}

そしてそれは正しいサイズを与えます。

更新機能が必要なようですが、見つかりません。ご意見をお聞かせください

4

2 に答える 2

6

これは、長年の内部Qtの問題が原因です(Qt3で最初に発生したことを覚えています)。最上位のウィジェットは、そのジオメトリを真に更新し、その境界を知るためにイベントを受信する必要があります。このイベントは、レイアウトによって生成されたサイズ変更イベントの後に常に受信されるように見えるため、ウィジェットを縮小するには常に遅すぎます。

受け入れられた回答に掲載された解決策は機能します。ただし、レイアウトの後に追加すると、以下に掲載されているより簡単なソリューションも機能します。

layout()->removeWidget( widget );

QApplication::processEvents( QEventLoop::ExcludeUserInputEvents );
resize( sizeHint() );

基本的に必要なのは、イベントループを実行して必要なイベントを配信し、resize()が実行される前に上部のウィジェットジオメトリが更新されるようにすることです。

複数のスレッドを実行している場合、またはスロットにイベントが配信されている場合、このコードには副作用がある可能性があることに注意してください。したがって、resize()の後にこの関数にコードを含めない方が安全です。

于 2015-05-27T03:40:15.113 に答える
5

ボタンスロットで正しい結果が得られた場合は、シングルショットタイマーによって呼び出されるスロットでsizeHint()、以降をいつでも呼び出すことができます。resize()

void MainWindow::fixSize()
{
    QSize size = sizeHint();
    resize(size);
}

void MainWindow::methodWhereIHideTheTabWidget()
{
    tabwidget->setVisible(false);
    QTimer::singleShot(0, this, SLOT(fixSize()));
}

このタイマーはゼロ遅延に設定されています。これは、プログラムがメインループに戻ったとき、できれば内部ウィジェットの状態が更新された後、すぐにスロットが呼び出されることを意味します。これで問題が解決しない場合は、ゼロを1に置き換えてみてください。

于 2012-12-18T22:45:41.757 に答える