6

QVBoxLayout の全体的なレイアウトを持つカスタム ウィジェットがあります。いくつかのラベル、QFormLayout、ボタン、およびすべての余分なスペースを占有するためのストレッチが含まれています。ラベルの 1 つが非常に大きくなる可能性があるため、テキストが読めない奇妙なケースがないようにしています。ウィジェットは QScrollArea 内に含まれており、ユーザーがウィンドウ全体を縮小してもウィジェットのすべての側面が表示されるようになっています。

QLabel は問題なくサイズ変更されているように見えますが、特定の狭さのポイントに達すると、ラベルの下部の数行が切り取られ、ウィジェットの下部にあるストレッチにスペースが割り当てられます。

Designer を使用せずにコードでこれをすべて行っているため、何かが不足している可能性は十分にあります。サブコンポーネントは、次の順序で 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 に設定されています。私は何を間違っていますか?

4

1 に答える 1

3

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

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)、ウィジェットの最小高さと実際に必要なピクセルの間の最大値が返されます。奇妙な部分は、現在の maximumHeight より大きい値を返すことを気にしていないように見えることです。

于 2013-01-02T13:26:07.187 に答える