30

空で始まるQScrollAreaウィジェットがあります。

空の QScrollArea

QGridLayout を使用した垂直レイアウトと、上部に保持するための垂直スペーサーがあり、スクロール領域全体に広がるのを防ぎます。

Qt Designer の QScrollArea

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

QScrollArea の奇妙なスクロール バー

垂直スクロールバーを常にオンにして、表示されたときに他のものの上に置かないようにしています。スクロール バーはスクロール ボックスよりも大きいことに注意してください。

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

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

押しつぶされた QGridLayout

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

使用できない行編集

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

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

小さすぎるレイアウト

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

私の質問は; QGridLayout に追加および削除するときに、ウィジェットのスクロール可能な領域を動的にサイズ変更するにはどうすればよいですか?

4

4 に答える 4

41

Google からここに来て、受け入れられた回答が得られなかった場合、それは他の秘密の呼び出しを見逃しているためです: QScrollArea::setWidget. スクロールする単一のウィジェットを作成し、明示的に識別する必要があります。子としてアイテムを追加するだけでは十分ではありません。に複数のアイテムを直接追加して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_()
于 2016-10-19T18:49:36.270 に答える
31

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

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

trueに設定します。

于 2012-10-08T12:26:03.473 に答える
0

Artfunkel の回答の更新:

「 Populate」ボタンを使用して for ループを実行し、スクロール領域にアイテムを追加する PySide6 デモを次に示します。各ボタンをクリックすると、それ自体も削除されます。

from PySide6.QtWidgets import *

app = QApplication([])

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

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

scroll.setWidget(inner)  # CRITICAL


def on_remove_widget(button):
    button.deleteLater()


def populate():
    for i in range(40):
        b = QPushButton(inner)
        b.setText(str(i))
        b.clicked.connect(b.deleteLater)
        inner.layout().addWidget(b)

b = QPushButton(inner)
b.setText("Populate")
b.clicked.connect(populate)
inner.layout().addWidget(b)

scroll.show()
app.exec()
于 2021-09-04T18:44:05.707 に答える