2016-07-11 8 views
0

QScrollAreaでウィジェットを動的に追加および削除しています。スクロールバーが表示される前に同時に最大4つのウィジェットを表示したいとします。つまり、基本的に、私が0-3のウィジェットを持っていて、もう1つを追加すると、スクロール領域が新しい高さに合わせてサイズ変更されます。その後、高さは4ウィジェットのサイズにとどまり、5番目、 ...Qt:最大4つのウィジェットを表示するようにQScrollAreaをリサイズ

現在、私はウィジェットの挿入/削除時に以下のメソッドを呼び出します。

void WidgetList::resizeScrollArea() 
{ 
    // height of the first four widgets 
    int widgetsHeight = 0; 
    for (int i = 0; i < _widgets.size() && i < 4; ++i) 
    { 
     // height of a widget 
     widgetsHeight += _widgets.at(i)->sizeHint().height(); 
    } 
    // some leeway to make sure we have some gap between the widgets 
    _ui->scrollArea->setFixedHeight(widgetsHeight + 5); 
} 

問題はのsizehint()は常に正しい高さ(時には大きすぎる)ではありませんが、どちらもサイズ()(多くの場合、小さすぎる)であるということです。だから、私のスクロールエリアはしばしば内容にとっては大きすぎますが、時にはうまくいきます。
私のウィジェットの高さがすべて同じではない場合もあります。また、sizeHintが正しいと思われることもありますが、時にはsizeです。
私はsizeHintがウィジェットが持っていたいサイズであることを理解しています。レイアウトがそれに与えるサイズではありませんが、なぜサイズが正しくないのか分かりません。

私はどのようにそれを行うべきであるかに関するアイデアは、最も高く評価されるでしょう。

+0

[この回答](http://stackoverflow.com/a/21265287/1329652)をご覧ください。 –

答えて

0

固定高さを設定する代わりに、sizeHint()をオーバーライドして、ウィジェットが望むサイズを返すようにする必要があります。これらの最初の4つの子ウィジェットのいずれかが変更されたときはいつでも、invalidate()に電話して、以前のキャッシュされた値を再計算する必要があることを含むレイアウトを伝える必要があります。

あなたのウィジェットがすべてQVBoxLayout(私は推測していますが、想定するのが妥当だと思われます)の場合は、計算でスペースと上マージンを取得する必要があります。

関連する問題