2013-02-20 32 views
11

基本的に私はQGridLayoutにいくつかのウィジェットを入れました。重要なのは2つのラベルです。これを使って画像を画面に描画します。もしユーザが望むなら、彼は着信画像の解像度を変えることができるので、ラベルのサイズを変更することができます。Qtレイアウト、ウィジェットのサイズ変更後に最小サイズに変更

ラベルの最初のサイズを320x240としましょう。ユーザーはVideoModeを640x480に変更すると、ラベルとGUI全体が完全にサイズ変更されます。しかし、ユーザーが320x240に戻ると、ラベルは縮小しますが、レイアウト/ウィンドウは縮小しません。

私はsizePoliciessizeHintsresize(0,0)で遊んだことがありますが、何もそのトリックはありませんでした。誰かが私を助けてくれましたか?あなたはレイアウトに変更を適用する前に、あなたのウィジェットの親ウィンドウの元のサイズを保存したときに、ユーザーにそれを復元する必要があり

Here, everything is okay still, 640 x 480 resizes perfectly but here, the layout is too big.

答えて

21

にウィジェットを再編成終了時にあなたはすべてのあなたを保持するレイアウトのサイズの制約を設定する必要がありますウィジェットを "SetFixedSize"に設定します。名前はうまくいかないようには思えませんが、レイアウトで必要なスペースだけが使用されます。 2番目のスクリーンショットのような問題はありません。

例:

mainLayout.setSizeConstraint(QLayout::SetFixedSize); 
+2

ありがとう!これは、この恐ろしい命名によって引き起こされた別の2時間の検索とデバッグを助けてくれました。 SetFixedSizeは、最小サイズがウィジェットのコンテンツの(潜在的には動的な)サイズに依存するため、意味的に固定サイズではない「自動サイズ変更」を意味するのはなぜですか?これについての説明はありますか? – hna

+0

名前はあまり意味がないし、Qtと仕事をしてからしばらくしていたので、私はこれをどのように見つけたのか思い出さない。しかし、この問題はしばらくの間私を襲った。うれしくて助かりました – user929404

+0

これはQScrollAreaウィジェットを除いてすべて機能します。あなたはその解決策を知っていますか? – Assimilater

1

:ここではいくつかのスクリーンショット

は、問題を明確にします元の状態に戻ります。あなたはウィジェットの親ウィンドウサイズではなくウィジェット親サイズで作業する必要が

注意してください。レイアウトの変更を適用する前に、あなたのウィジェットで

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

あなたは、コンパクトなサイズ

this->window().resize(minimumWindowSize); 
+0

ありがとう、私はそれを数分で試してみます。実際には、320x240から1280x1024までのさまざまな解像度の組み合わせがあります。これは、最大10のサイズ構成をとります。 Qtがこれを自動的に行う方法はありませんか? – Hafnernuss

+0

私はそれをテストしませんでしたが、あなたは最小サイズを保存するだけで(あるいはヌルサイズを提供して)試みるかもしれません。私が正しい場合、QTはウィンドウのサイズを自動的に最小値にして、含まれているすべてのウィジェットを表示します – Pierluigi

1

だから、私はミュープロジェクトでやってるまさにです。 解決方法は問題ではありません。私はビデオをレンダリングするためのウィジェット、またはあなたのケースのイメージを持っているだけです。

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(); 

} 
} 
5

QLayout ::あなたはすべての回であなたのウィジェットのサイズは固定に保つ好むときsetSizeConstraint(QLayout :: SetFixedSizeが)も、この問題を解決 - つまり、あなたはそれは常にその "に固定することしたい場合(子ウィジェットのサイズが変わるにつれて変わる可能性があります)。これは、「固定」とは、固定サイズが固定されている場合でも、固定サイズが固定されていることを意味します。 (Qtという言葉では、私が「パックされた」サイズと呼んでいるのは単純にウィジェットのサイズヒントです。)

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

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

その子供のサイズを変更しているコンテナがトップレベルウィンドウでない場合、adjustSize()は、コンテナとその両親に再帰的に呼び出されなければならないかもしれないことに注意してください。 (私の場合は、とにかくそれをしなければならなかったのですが、私もサイズ制約スキームを試してみましたが、最上位レベルでのみ制約を適用するとすべてのレベルをコンパクトにすることができました。これらの観測では、私は単にそれらを共有します。)

関連する問題