PyQt - 减少小部件中的边距和间距*扩展*布局

10
考虑一个具有QWidget的QMainWindow。此小部件具有QHBoxLayout。我向其中添加了两个其他小部件,每个小部件都有QVBoxLayout。
现在,我想让QVBoxLayout中的小部件彼此更接近。尝试使用.setMargin(0)、.setSpacing(0)和.setContentsMargins(0,0,0,0)来实现此目的。
然而,结果是它们之间的间隔实际上增加了,而不是减少了,如图所示(其中Gain是我将边距和间距设置为零的小部件)。

enter image description here

以下是重现此问题的代码。 (实际上,使用 QGridLayout 时也会发生相同的情况。)
以下是两个不同复杂度级别的问题:
(a) 由于两个小部件之间唯一的区别在于其中一个将边距和间距设置为零,因此使用的某个方法调用必须对布局或小部件属性进行了其他更改。通过设置任何一个 .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_())
2个回答

12

首先:setMargin 是一个已经过时的方法,被setContentsMargins取代了,所以你可以忽略它。

其次:间距的增加是由于将边距设为零造成的。这两个垂直布局位于同一水平布局中,因此它们必然具有相同的高度。但是左侧的布局没有边距,因此它有更多的可用空间来伸展。如果两个垂直布局具有相同的设置,则可以通过调整窗口大小将它们的子部件挤得更近。

因此,你需要在两个布局上使用setSpacing来更改间距。


1
这其实是一个很好的解释。我没有想到过这个。最终的意思是需要在QVBoxLayout中添加.addStretch(1),以使.setSpacing(0)的效果生效。 - ImportanceOfBeingErnest
1
@ImportanceOfBeingErnest。是的,我本来想加一个关于addStretch的PS,但现在你帮我省去了这个麻烦 :-) - ekhumoro

11
在最新的PyQt 5.10中,setContentsMargins方法运行良好。您可以为小部件创建一个布局,然后应用其边距。 widget.layout.setContentsMargins(0,0,0,0)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接