web-dev-qa-db-ja.com

Qtレイアウト、ウィジェットサイズの変更後に最小サイズに変更

基本的には、いくつかのウィジェットが入ったQGridLayoutを持っています。重要なのは2つのラベルで、画面に画像を描画するために使用します。まあ、ユーザーが望むなら、彼は入って来る画像の解像度を変更することができます、したがって、ラベルを強制的にサイズ変更させます。

ラベルの初期サイズが_320x240_であると仮定します。ユーザーがVideoModeを_640x480_に変更すると、ラベルとGUI全体が完全にサイズ変更されます。しかし、ユーザーが_320x240_に戻ると、ラベルは縮小しますが、レイアウト/ウィンドウは縮小しません。

私はsizePoliciessizeHints、およびresize(0,0)をいじってみましたが、何もうまくいきませんでした。誰かがこれを手伝ってくれませんか?

ここに問題を明確にするスクリーンショットがあります:

Here, everything is okaystill, 640 x 480 resizes perfectlybut here, the layout is too big.

24
Hafnernuss

すべてのウィジェットを保持するレイアウトのサイズ制約を「SetFixedSize」に設定する必要があります。名前は機能するように聞こえませんが、レイアウトが必要なスペースのみを使用することを保証します。 2番目のスクリーンショットのように問題は発生しません。

例:

mainLayout.setSizeConstraint(QLayout::SetFixedSize);
45
user929404

QLayout :: setSizeConstraint(QLayout :: SetFixedSize)は、ウィジェットのサイズを常に固定したままにする場合、つまり、常に「パックされた」サイズに固定したい場合(この場合でも、子ウィジェットのサイズが変わると変化します)。つまり、「固定」とは、正しいサイズに「固定」されていることを意味します。 (Qtの用語では、「パック」サイズと呼んでいるのはウィジェットのsizeHintだけです。)

ただし、制約が強すぎるソリューションの場合もあります。特に、それをトップレベルのウィンドウに適用すると、ユーザーはウィンドウのサイズを自由に変更できなくなります。それが気に入らない場合は、代わりに、「サイズをsizeHintに設定」操作を必要なときに即座に実行することができます。これを行う方法は、QWidget :: adjustSize()を呼び出すことです。

http://doc.qt.io/qt-5/qwidget.html#adjustSize

子のサイズが変更されているコンテナがトップレベルウィンドウでない場合、コンテナとその親でadjustSize()を再帰的に呼び出す必要があることに注意してください。 (とにかく、私はそれをしなければなりませんでした。私はサイズ制約スキームも試しました、そして最上位レベルでのみ制約を適用することはすべてのレベルを圧縮することに成功したことがわかりました。有用にコメントするのに十分なQtの知識がありません。これらの観察については、私は単にそれらを共有します。)

8
mjwach

レイアウトに変更を適用する前にウィジェットの親ウィンドウの元のサイズを保存し、ユーザーが元のサイズに切り替えたときに元のサイズに戻す必要があります。

ウィジェットの親ウィンドウサイズではなくウィジェットの親ウィンドウサイズで作業する必要があることに注意してください。

レイアウト変更を適用する前にウィジェットで:

minimumWindowSize = this->window().size();

ウィジェットをコンパクトサイズに再編成したとき

this->window().resize(minimumWindowSize);
2
Pierluigi

つまり、私がmuプロジェクトでやっていることです。解像度osは関係ありません。私はあなたの場合、ビデオまたは画像をレンダリングするためのウィジェットがあれば十分です。

void MainWindow::resizeEvent(QResizeEvent* event)
 {
   QMainWindow::resizeEvent(event);
   if ((player != 0) && ((player->isPlaying()) || player->isLoaded() || player>isLoaded())){
     renderer->resize(ui->mainVideoWidget->width(),ui->mainVideoWidget->height());
     resizeFilter();

 }
}
1
AntonD