PyQt 小部件与其他元素对齐

PyQt widget alignment with other elements

考虑这个应该显示两个 GroupBox 的小型 GUI 示例。第一个放在自定义的QWidget中:

import sys
from PyQt4 import QtGui

class SomeBoxWidget(QtGui.QWidget):
    def __init__(self):
        super(SomeBoxWidget, self).__init__()

        #create GroupBox and layout
        self.group_box = QtGui.QGroupBox("group box in widget")
        self.group_box_layout = QtGui.QVBoxLayout()
        self.group_box.setLayout(self.group_box_layout)

        #place some stuff there
        self.btn = QtGui.QPushButton("button", self)
        self.group_box_layout.addWidget(self.btn)

        self.main_layout = QtGui.QVBoxLayout()
        self.main_layout.addWidget(self.group_box)
        self.setLayout(self.main_layout)

这个 QWidget 放置在第二个 QGroupBox 旁边,后者直接放置在主 GUI 布局中:

class SomeGui(QtGui.QWidget):

    def __init__(self):
        super(SomeGui, self).__init__()

        #create 2nd GroupBox and layout
        self.group_box = QtGui.QGroupBox("group box in layout")
        self.group_box_layout = QtGui.QVBoxLayout()
        self.group_box.setLayout(self.group_box_layout)

        self.btn = QtGui.QPushButton("button", self)
        self.group = SomeBoxWidget()

        self.group_box_layout.addWidget(self.btn)

        self.main_layout = QtGui.QVBoxLayout()
        self.main_layout.addWidget(self.group_box)
        self.main_layout.addWidget(self.group)

        self.setLayout(self.main_layout)

        self.show()

def main():
    app = QtGui.QApplication(sys.argv)
    ex = SomeGui()
    app.exec_()        

if __name__ == '__main__':
    main()

您会注意到两个 QGroupBoxes 没有对齐,我假设是因为第一个放在 QWidget 中。我如何对齐它们以将第一个框保持在小部件内?如果可能,请不要以某种方式设置默认的固定 hight/width 值。

编辑:我假设我需要类似 setContensMargins 的东西,但对于外部区域...

您可以通过在 class __init__:

中添加,将 SomeBoxWidget 容器小部件布局的内容边距设置为 0
self.main_layout.setContentsMargins(0, 0, 0, 0)

其中setContentsMargins的参数分别是布局的左、上、右、下边距。根据文档:

By default, QLayout uses the values provided by the style. On most platforms, the margin is 11 pixels in all directions.

在您提供的代码中执行上述操作会导致: