1) レイアウト
ここでの他の回答は非常に不明確であり、レイアウトの余白がどのように機能するかについておそらくオフです。実際には非常に簡単です。
- レイアウトにはコンテンツ マージンがあります
- ウィジェットにはコンテンツ マージンがあります
これらは両方とも、内容の周囲にパディングを定義します。レイアウトのマージン設定 2 は、すべての辺に 2 ピクセルのパディングを意味します。親子のウィジェットとレイアウトがある場合 (UI を構成するときは常にそうです)、各オブジェクトは、個別に有効になる特定のマージンを指定できます。つまり... マージンを 2 に指定する親レイアウトと、マージンを 2 に指定する子レイアウトを使用すると、実質的に 4 ピクセルのマージンが表示されます (明らかに、ウィジェットにフレームがある場合、その間に何らかのフレーム描画が行われます)。
簡単なレイアウトの例はこれを示しています:
w = QtGui.QWidget()
w.resize(600,400)
layout = QtGui.QVBoxLayout(w)
layout.setMargin(10)
frame = QtGui.QFrame()
frame.setFrameShape(frame.Box)
layout.addWidget(frame)
layout2 = QtGui.QVBoxLayout(frame)
layout2.setMargin(20)
frame2 = QtGui.QFrame()
frame2.setFrameShape(frame2.Box)
layout2.addWidget(frame2)

最上位の余白は各辺で 10、子レイアウトは各辺で 20 であることがわかります。数学に関しては特に複雑なことはありません。
マージンは、サイドごとに指定することもできます。
# left: 20, top: 0, right: 20, bottom: 0
layout.setContentsMargins(20,0,20,0)
レイアウトに間隔を設定するオプションもあります。間隔は、レイアウトの各子の間に配置されるピクセル量です。これを 0 に設定すると、それらが互いに正反対であることを意味します。スペースはレイアウトの特徴であり、マージンはオブジェクト全体の特徴です。レイアウトには、周囲にマージンを設定したり、子の間にスペースを設定したりできます。また、ウィジェットの子は、個々の表示の一部である独自のマージンを持つことができます。
layout.setSpacing(10) # 10 pixels between each layout item
2) QTextEdit の自動サイズ変更
次に、質問の 2 番目の部分です。自動サイズ変更 QTextEdit を作成するにはいくつかの方法があると確信しています。しかし、これにアプローチする 1 つの方法は、ドキュメント内のコンテンツの変更を監視し、ドキュメントの高さに基づいてウィジェットを調整することです。
class Window(QtGui.QDialog):
def __init__(self):
super(Window, self).__init__()
self.resize(600,400)
self.mainLayout = QtGui.QVBoxLayout(self)
self.mainLayout.setMargin(10)
self.scroll = QtGui.QScrollArea()
self.scroll.setWidgetResizable(True)
self.scroll.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOn)
self.mainLayout.addWidget(self.scroll)
scrollContents = QtGui.QWidget()
self.scroll.setWidget(scrollContents)
self.textLayout = QtGui.QVBoxLayout(scrollContents)
self.textLayout.setMargin(10)
for _ in xrange(5):
text = GrowingTextEdit()
text.setMinimumHeight(50)
self.textLayout.addWidget(text)
class GrowingTextEdit(QtGui.QTextEdit):
def __init__(self, *args, **kwargs):
super(GrowingTextEdit, self).__init__(*args, **kwargs)
self.document().contentsChanged.connect(self.sizeChange)
self.heightMin = 0
self.heightMax = 65000
def sizeChange(self):
docHeight = self.document().size().height()
if self.heightMin <= docHeight <= self.heightMax:
self.setMinimumHeight(docHeight)
QTextEdit
->をサブクラスGrowingTextEdit
化し、そのドキュメントから発せられる信号をsizeChange
、ドキュメントの高さをチェックするスロットに接続しました。また、heightMin および heightMax 属性を含めて、自動拡張を許可する大きさまたは小ささを指定できるようにしました。これを試してみると、ボックスに入力すると、ウィジェットのサイズが自動的に変更され、行を削除すると縮小されることがわかります。必要に応じてスクロールバーをオフにすることもできます。現在、各テキスト編集には、親のスクロール領域に加えて、独自のバーがあります。docHeight
また、小さなパッド値を追加して、コンテンツのスクロールバーが表示されないように拡張できると思います。
このアプローチは、実際には低レベルではありません。一般的に公開されているシグナルとウィジェットの子メンバーを使用して、状態変化の通知を受け取ります。既存のウィジェットの機能を拡張するためにシグナルを利用するのはかなり一般的です。
