2012-12-31 6 views
5

私はQVBoxLayoutの全体的なレイアウトを持つカスタムウィジェットを持っています。それは、いくつかのラベル、QFormLayout、ボタン、およびすべての余分なスペースを食べるストレッチを含んでいます。ラベルの1つがかなり大きいので、テキストが読めない奇妙なケースがないようにしています。ウィジェットはQScrollArea内に含まれており、ユーザーがウィンドウの全体を縮小しても、そのウィジェットのすべての側面を確認できます。QLabelはサイズ変更時にテキストを切り捨てます

QLabelは細かいサイズで表示されますが、ある狭い範囲に達すると、ラベルの下の数行を切り取り、ウィジェットの下部にある領域にスペースを割り当てます。

私はデザイナーなしですべてこれをコード内で実行しています。だから、私は何かが欠落している可能性があります。サブコンポーネントは、次の順序で全体QVBoxLayoutに添加される:

OverallLayout = new QVBoxLayout(this); 
Title   = new QLabel(); 
Description = new QLabel(); 
SubRegion  = new QFormLayout(); 
Button  = new QButton(); 
... 
// set text values, wordWrap(true), and Font for labels 
OverallLayout->addWidget(Title); 
OverallLayout->addWidget(Description); 
OverallLayout->addLayout(SubRegion); 
OverallLayout->addStrut(MIN_DIST); 
OverallLayout->addWidget(Button); 
OverallLayout->addStretch(STRETCH_FACTOR); 

試験結果は:QLabel者のsizehint()関数から返された結果を調べる、返される値は、ウィジェットが水平に収縮するように変更する表示されません。しかし、QLabelは、垂直方向の部屋(153のヒントと103のヒント)を使用するように拡張していますが、すべてのテキストを収めるには不十分です。 QLabelが最初に表示されるとき、それはsizeHintより少ないピクセルを持ちますが、そのheightForWidthの量で十分です。サイズを変更すると、heightForWidthの値より30小さいが、そのsizeHintよりも大きくなります。

大きなQLabelのhasHeightForWidth()とwordWrap()の値がtrueに設定されています。私は間違って何をしていますか?

+0

これらのウィジェットがレイアウトに追加される場所にコードスニペットを追加できますか?私はカットオフがないようにsetMinimumHeight()によってQLabelの最小サイズを設定しなければならないと思います。代わりに、スペーサー要素の最大高さ値を設定することもできます。 –

+0

私はそれを修正する方法の1つは、サイズ変更されたメソッドにリンクし、最小の高さをDescriptionラベルのheightForWidth(width)値に設定することです。しかし、これはちょっとしたことだと思うので、レイアウトマネージャにその仕事をさせる適切な方法は何だろうと思っていました。 – ElCraneo

+0

しかし 'setMinimumHeight()'を使うのはどうですか? – jdi

答えて

2

QLabelの最大値を動的に設定するために、ウィジェットのresizeEvent(QResizeEvent *evt)関数を上書きする方法が終了しました。注意すべき

void MyWidget::resizeEvent (QResizeEvent *evt) { 
    int newHeight = Description.heightForWidth(Description.width()); 
    Description.setMaximumHeight(newHeight); 
    QWidget::resizeEvent(evt); 
    // Note: I'm not sure if this last step is necessary 
} 

興味深い項目は、setMinimumHeight(newHeight)setMaximumHeight(newHeight)の両方を行う場合は、ラベルがテキストに合わせて垂直方向に成長しますが、ラベルは水平に成長し、余分なスペースを必要としないとき、それは縮小したことがないということです。私の推測では、heightForWidth(int w)は、ウィジェットのminimumHeightと実際に必要なピクセルとの間の最大値を返します。奇妙な点は、現在のmaximumHeightよりも大きな値を返すことには気をつけていないようです。

関連する問題