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.
在您提供的代码中执行上述操作会导致:
考虑这个应该显示两个 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.
在您提供的代码中执行上述操作会导致: