web-dev-qa-db-ja.com

内部にウィジェットが配置されたときにQScrollAreaのコンテンツのサイズを変更するにはどうすればよいですか?

私は QScrollArea ウィジェットを持っています。これは空から始まります。

empty QScrollArea

これは、QGridLayoutを備えた垂直レイアウトと、上部に配置し、スクロール領域全体に拡大しないようにする垂直スペーサーを備えています。

QScrollArea in Qt Designer

プログラムの他の場所には、QTextEditがあり、変更すると、その内容が「種」要素をスキャンし、QGridLayoutに追加されます。削除された種の要素も削除されます。このビットは機能します。

QScrollArea with strange scroll bar

私は常に垂直スクロールバーを回転させているので、それが表示されたときに、そこにある他のものの上に置かれません。ただし、スクロールバーは必ずしも必要ではありませんが、スクロールボックスよりも大きいことに注意してください。

これが問題です。スクロール領域がプリセットされているようで、変更できません。 QGridLayoutに行を追加しても、スクロール領域のサイズは増加しません。

代わりに、同じサイズを維持し、QGridLayoutを圧縮して、醜く(最初は)見えます。

Squashed QGridLayout

さらに追加すると、使用できなくなります。

unusable line edits

繰り返しになりますが、スクロールバーは以前の画像と同じサイズです。最初の2つのイメージはQt Designerからのもので、次の3つは実行中のプログラムからのものです。

QScrollAreaが大きくなるようにウィンドウのサイズを変更すると、次のようになります。

dumb too small layout

適切にサイズ変更されていないスクロール領域内のレイアウトがあることを示しています。

私の質問です。 ウィジェットのスクロール可能な領域をQGridLayoutに追加および削除するときに動的にサイズ変更するには、何をする必要がありますか?

23
will

ドキュメント 回答を提供します:

widgetResizable:bool
このプロパティは、スクロール領域がビューウィジェットのサイズを変更する必要があるかどうかを保持します。このプロパティがfalse(デフォルト)に設定されている場合、スクロール領域はウィジェットのサイズに従います。

Trueに設定します。

26
UmNyobe

ここからGoogleにアクセスしていて、受け入れられた回答でうまくいかない場合は、他の秘密の呼び出しがないためです:QScrollArea::setWidget。スクロールする単一のウィジェットを作成し、explicitlyを識別する必要があります。アイテムを子として追加するだけでは十分ではありません。複数のアイテムをScrollAreaに直接追加することもできません。

このスクリプトは、QScrollAreaの簡単な作業例を示しています。

from PySide.QtGui import *

app = QApplication([])

scroll = QScrollArea()
scroll.setWidgetResizable(True) # CRITICAL

inner = QFrame(scroll)
inner.setLayout(QVBoxLayout())

scroll.setWidget(inner) # CRITICAL

for i in range(40):
    b = QPushButton(inner)
    b.setText(str(i))
    inner.layout().addWidget(b)

scroll.show()
app.exec_()
28
Artfunkel