QWidget
を中心ウィジェットとするQMainWindow
のケースを考えてみましょう。このウィジェットはQHBoxLayout
です。私はQVBoxLayout
を持つ2つのウィジェットを追加します。 QVBoxLayout
内のウィジェットを互いに近づけたいと思っています。この目的のために、.setMargin(0)
,.setSpacing(0)
および.setContentsMargins(0,0,0,0)
を使用しようとしています。PyQt - ウィジェットでマージンとスペースを減らす*レイアウトを展開する
しかし、その結果、図のように実際にはが増加してになります(Gainは余白と間隔をゼロに設定するウィジェットです)。
この問題を再現するコード
は、以下の付加されます。 (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_())
これは実際には良い説明です。私はこれについて考えなかった。最後に、 '.setSpacing(0)'の効果を有効にするために '.addStretch(1)'を 'QVBoxLayout'に追加する必要があることを意味します。 @ImportanceOfBeingErnest。 – ImportanceOfBeingErnest
はい、私は 'addStretch'についてPSを追加しようとしていましたが、今あなたは私を悩ましました:-) – ekhumoro