考虑一个具有QWidget的QMainWindow。此小部件具有QHBoxLayout。我向其中添加了两个其他小部件,每个小部件都有QVBoxLayout。
现在,我想让QVBoxLayout中的小部件彼此更接近。尝试使用.setMargin(0)、.setSpacing(0)和.setContentsMargins(0,0,0,0)来实现此目的。
然而,结果是它们之间的间隔实际上增加了,而不是减少了,如图所示(其中Gain是我将边距和间距设置为零的小部件)。 以下是重现此问题的代码。 (实际上,使用
以下是两个不同复杂度级别的问题:
(a) 由于两个小部件之间唯一的区别在于其中一个将边距和间距设置为零,因此使用的某个方法调用必须对布局或小部件属性进行了其他更改。通过设置任何一个
(b) 如何使此示例中文本标签和组合框之间的间距更小?
现在,我想让QVBoxLayout中的小部件彼此更接近。尝试使用.setMargin(0)、.setSpacing(0)和.setContentsMargins(0,0,0,0)来实现此目的。
然而,结果是它们之间的间隔实际上增加了,而不是减少了,如图所示(其中Gain是我将边距和间距设置为零的小部件)。 以下是重现此问题的代码。 (实际上,使用
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_())
QVBoxLayout
中添加.addStretch(1)
,以使.setSpacing(0)
的效果生效。 - ImportanceOfBeingErnestaddStretch
的PS,但现在你帮我省去了这个麻烦 :-) - ekhumoro