2016-10-07 13 views
1

QWidgetを中心ウィジェットとするQMainWindowのケースを考えてみましょう。このウィジェットはQHBoxLayoutです。私はQVBoxLayoutを持つ2つのウィジェットを追加します。 QVBoxLayout内のウィジェットを互いに近づけたいと思っています。この目的のために、.setMargin(0),.setSpacing(0)および.setContentsMargins(0,0,0,0)を使用しようとしています。PyQt - ウィジェットでマージンとスペースを減らす*レイアウトを展開する

しかし、その結果、図のように実際にはが増加してになります(Gainは余白と間隔をゼロに設定するウィジェットです)。

enter image description here

この問題を再現するコード

は、以下の付加されます。 ( QGridLayoutを使用した場合と同じことが実際に起こる。)ここ

は、2つの異なる複雑さのレベルで問題である2つのウィジェット間の唯一の違いは一つのマージンを有していることであるので

(A)スペースをゼロに設定すると、使用されるメソッド呼び出しの1つは、レイアウトやウィジェットのプロパティに対して何か他のことをしているに違いありません。 .setMargin(0),.setSpacing(0)setContentsMargins(0,0,0,0)のいずれかを設定すると、他のプロパティが変更されますか?

(b)この例では、テキストラベルとコンボボックスの間隔を小さくするにはどうすればよいですか?


from PyQt4 import QtGui 
import sys 

class LabeledComboBox(QtGui.QWidget): 
    def __init__(self, text="", items=[], parent=None): 
     super(LabeledComboBox, self).__init__(parent) 
     self.parent = parent 
     self.widgetlayout = QtGui.QVBoxLayout(self) 
     self.widgetlayout.addWidget(QtGui.QLabel(text)) 
     self.Combo = QtGui.QComboBox() 
     self.Combo.addItems(items) 
     self.widgetlayout.addWidget(self.Combo) 
     self.parent.mylayout.addWidget(self) 

    def printParams(self): 
     # print some margin/spacing parameters for testing 
     m = self.widgetlayout.margin() 
     s = self.widgetlayout.spacing() 
     cm = self.widgetlayout.getContentsMargins() 
     print "margin: {m}, spacing: {s}, ContentsMargin: {cm}".format(m=m, s=s, cm=cm) 

class App(QtGui.QMainWindow): 
    def __init__(self, parent=None): 
     super(App, self).__init__(parent) 
     self.mainbox = QtGui.QWidget() 
     self.mylayout = QtGui.QHBoxLayout() 
     self.mainbox.setLayout(self.mylayout) 
     self.setCentralWidget(self.mainbox) 

     self.GainWidget = LabeledComboBox("Gain", ['low', 'medium', 'high'], self) 
     self.RevolutionsWidget = LabeledComboBox("Revolutions", ['100', '200', '400'], self) 


     self.GainWidget.printParams() 
     # this outputs: margin: 9, spacing: 6, ContentsMargin: (9, 9, 9, 9) 
     # now I set everything to zero 
     self.GainWidget.widgetlayout.setMargin(0) 
     self.GainWidget.widgetlayout.setSpacing(0) 
     self.GainWidget.widgetlayout.setContentsMargins(0,0,0,0) 
     # check 
     self.GainWidget.printParams() 
     # margin: 0, spacing: 0, ContentsMargin: (0, 0, 0, 0) 


if __name__=='__main__': 
    app = QtGui.QApplication(sys.argv) 
    thisapp = App() 
    thisapp.show() 
    sys.exit(app.exec_()) 

答えて

1

まず:setMarginsetContentsMarginsに取って代わらbeedた旧式の方法ですので、あなたはそれを無視することができます。

第2に、分離の増加は、余白をゼロに設定することによって引き起こされます。 2つの垂直レイアウトは同じ水平レイアウトにあるため、必ず同じ高さになります。しかし、左のレイアウトには余白がないため、余白を広げることができます。両方のの縦レイアウトの設定が同じ場合、ウィンドウのサイズを変更することで、子ウィジェット同士を近づけることができます。

だから、間隔を変更するにはsetSpacing両方上のレイアウトを使用する必要があります。

+0

これは実際には良い説明です。私はこれについて考えなかった。最後に、 '.setSpacing(0)'の効果を有効にするために '.addStretch(1)'を 'QVBoxLayout'に追加する必要があることを意味します。 @ImportanceOfBeingErnest。 – ImportanceOfBeingErnest

+0

はい、私は 'addStretch'についてPSを追加しようとしていましたが、今あなたは私を悩ましました:-) – ekhumoro

0

最新のPyQt 5.10 setContentsMarginsの方法がうまくいきます。 ウィジェットのレイアウトを作成し、その余白を適用することができます。

widget.layout.setContentsMargins(0,0,0,0)

関連する問題