4

QScrollArea可能な限り最小のスペースを最大の高さまで確保するのは本当に大変でした。

私の GUI モデルは次のとおりです。 AQScrollAreaには、 class のウィジェットが取り込まれた垂直レイアウトが含まれていますTableRow。私はこのクラスTableRowが可能な限り最小限の高さを取ることを望みます. 上部には常に表示されるウィジェットがあり、下部には表示をQScrollArea切り替えることができるラベルが含まれています。ラベルは、0 文字または無限の長さ (ハードウェアの制限は別として) のメモ用です。

クラスのラベルTableRowの場合、垂直方向sizePolicyを に設定するFixedと、すべてのコンテンツに合わせて実際に必要な量が正確に使用されることがわかりました ( Qt レイアウト、ウィジェットのサイズ変更後に最小にサイズ変更 を参照)。ただし、これは では機能しないようQScrollAreaです。sizePolicy実際、私が試したものはすべてQScrollArea、固定された高さに保たれています。を除いてIgnoreQScrollAreaその内容に関係なく、 は高さ 0 になります。

この問題の簡略化されたバージョンを生成するgit ブランチを作成しました。

固定の垂直方向の sizePolicy を適用した結果は次のとおりです。 固定縦サイズポリシーの結果

このテスト ケースに期待すること:

  • 最初のウィジェットの高さはほぼ 30px (上のウィジェットの高さ) で、QLabelQScrollArea
  • 2 番目のウィジェットの高さは 130 ピクセル (最大高さ 100 ピクセル) よりも短くする必要がありますが、QScrollAreaスクロールせずにラベルを表示するのに十分な大きさにする必要があります
  • sizePolicy3 番目のウィジェットの高さは 130px で、スクロールバーが表示されます (この部分は、垂直方向が に設定されている場合を除いて、私が試したすべてのケースで正しいですIgnored)

QScrollArea の高さがその子ウィジェットに依存する理由は明らかではないため、これを機能させるにはいくつかのことをオーバーライドする必要があるかもしれないことを理解しています (これがおそらく、これを簡単にするように設計されていないか、少なくともそうではなかったように)。

しかし、私がしようとしているケースは十分に一般的であり、現在のアプローチは正当化できると思います。個々のウィジェットが最大の高さに達した後にスクロールする別の/より良い方法がある場合、私が期待している3つの条件を満たしていれば、答えとしてそれを受け入れます。

4

1 に答える 1

3

これは解決策というよりハックのように感じますが、少なくとも短期的にはうまくいきます。lblNotes のテキストはランタイムを変更しないため、TableRowウィジェットのコンストラクターに次のコードを追加できました。

// Hack to resize QScrollAreas
ui->lblNotes->adjustSize(); // Otherwise lblNotes will think its height is still ~0px
int height = ui->lblNotes->height() + 12; // Borders and margins add up to 12px
if (height > 100) { height = 100; } // Cap the height at desired maximum value
ui->scrollArea->setFixedHeight(height);

動的に設定されたテキストのケースに対処する必要がある場合は、これを関数にラップして、lblNotes のテキストが設定されるたびに呼び出されるようにすることができます。

ソリューションが存在する場合は、Qt がネイティブに備えているレイアウト機能を使用するソリューションを使用することをお勧めします。一部のQScrollAreaコンテンツは、将来的に高さを決定するのにそれほど単純ではない可能性があります.

于 2015-05-19T16:43:31.063 に答える