본문 바로가기
코딩취미/Python

레이아웃(Layout) 및 위젯(Widget)간의 간격설정 방법 : setSpacing, setContentsMargins, QSpacerItem

by 브링블링 2024. 7. 30.
반응형

레이아웃(Layout) 및 위젯(Widget)간의 간격설정 방법 : setSpacing, setContentsMargins, addSpacerItem

PyQt를 사용하여 GUI 애플리케이션을 개발할 때, 위젯 간의 간격과 레이아웃의 여백을 조정하는 것은 사용자 인터페이스의 가독성과 사용성을 높이는 데 중요한 요소입니다. 이 글에서는 setSpacing과 setContentsMargins 메서드를 사용하여 레이아웃과 위젯 간의 간격을 설정하는 방법을 정리했습니다. 여기에서 정리한 setSpacing을 사용하면 레이아웃 내의 위젯 간의 간격을 쉽게 조정할 수 있으며, setContentsMargins를 사용하면 레이아웃의 외부 여백을 설정할 수 있습니다. 그리고 addSpacerItem을 사용하여 레이아웃에 공간을 추가할 수 있습니다. 

 

setSpacing 메서드

setSpacing 메서드는 레이아웃 내의 위젯들 사이의 간격을 조정하는 데 사용됩니다. 이 메서드를 사용하면 레이아웃에 포함된 모든 위젯 사이의 간격을 한 번에 설정할 수 있습니다. 예를 들어, QVBoxLayout이나 QHBoxLayout을 사용할 때 위젯들 간의 수직 또는 수평 간격을 쉽게 조정할 수 있습니다.

layout.setSpacing(spacing)
  • spacing: 위젯 간의 간격을 나타내는 정수 값입니다. 이 값은 픽셀 단위로 측정됩니다. 예를 들어, spacing 값을 10으로 설정하면 레이아웃 내의 모든 위젯 사이의 간격이 10픽셀이 됩니다.
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QVBoxLayout

class Example(QWidget):
    def __init__(self):
        super().__init__()

        self.initUI()

    def initUI(self):
        self.btn1 = QPushButton("Button 1")
        self.btn2 = QPushButton("Button 2")
        self.btn3 = QPushButton("Button 3")

        layout = QVBoxLayout()
        layout.addWidget(self.btn1)
        layout.addWidget(self.btn2)
        layout.addWidget(self.btn3)

        layout.setSpacing(20)  # 위젯 사이의 간격을 20픽셀로 설정

        self.setLayout(layout)
        self.setWindowTitle('QVBoxLayout setSpacing Example')
        self.show()

if __name__ == '__main__':
    import sys
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

 

setContentsMargins 메서드

setContentsMargins 메서드는 레이아웃의 외부 여백을 설정하는 데 사용됩니다. 이 메서드를 사용하여 레이아웃의 왼쪽, 위, 오른쪽, 아래 여백을 개별적으로 지정할 수 있습니다. 이를 통해 레이아웃 내의 위젯들이 가장자리와 적절한 간격을 유지할 수 있게 합니다.

layout.setContentsMargins(left, top, right, bottom)

 

  • setContentsMargins(left, top, right, bottom)는 레이아웃의 외부 여백을 설정합니다.
  • left: 레이아웃의 왼쪽 여백
  • top: 레이아웃의 위쪽 여백
  • right: 레이아웃의 오른쪽 여백
  • bottom: 레이아웃의 아래쪽 여백

 

from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QVBoxLayout

class Example(QWidget):
    def __init__(self):
        super().__init__()

        self.initUI()

    def initUI(self):
        self.btn1 = QPushButton("Button 1")
        self.btn2 = QPushButton("Button 2")
        self.btn3 = QPushButton("Button 3")

        layout = QVBoxLayout()
        layout.addWidget(self.btn1)
        layout.addWidget(self.btn2)
        layout.addWidget(self.btn3)

        # 레이아웃의 여백을 설정 (왼쪽, 위, 오른쪽, 아래)
        layout.setContentsMargins(10, 20, 10, 20)  # Left: 10px, Top: 20px, Right: 10px, Bottom: 20px

        self.setLayout(layout)
        self.setWindowTitle('QVBoxLayout setContentsMargins Example')
        self.show()

if __name__ == '__main__':
    import sys
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())
반응형

addSpacerItem 메서드 (with QSpacerItem)

QSpacerItem과 addSpacerItem은 PyQt5에서 레이아웃 내의 위젯 사이에 공간을 추가하는 데 사용됩니다. QSpacerItem을 사용하여 고정된 크기 또는 확장 가능한 공간을 만들고, 이를 레이아웃에 추가할 수 있습니다.

QSpacerItem(width, height, hPolicy=QSizePolicy.Minimum, vPolicy=QSizePolicy.Minimum)

 

  • width: 가로 크기 (픽셀 단위)
  • height: 세로 크기 (픽셀 단위)
  • hPolicy: 수평 크기 정책 (QSizePolicy 값)
  • vPolicy: 수직 크기 정책 (QSizePolicy 값)
  • 주요 QSizePolicy 값
    • QSizePolicy.Minimum: 가능한 최소 크기
    • QSizePolicy.Fixed: 고정된 크기
    • QSizePolicy.Expanding: 가능한 한 많이 확장
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QVBoxLayout, QSpacerItem, QSizePolicy

class Example(QWidget):
    def __init__(self):
        super().__init__()

        self.initUI()

    def initUI(self):
        self.btn1 = QPushButton("Button 1")
        self.btn2 = QPushButton("Button 2")
        self.btn3 = QPushButton("Button 3")

        layout = QVBoxLayout()
        layout.addWidget(self.btn1)

        # QSpacerItem을 생성하고 레이아웃에 추가
        spacer = QSpacerItem(0, 20, QSizePolicy.Minimum, QSizePolicy.Fixed)
        layout.addSpacerItem(spacer)  # Add spacer between widgets

        layout.addWidget(self.btn2)

        spacer = QSpacerItem(0, 20, QSizePolicy.Minimum, QSizePolicy.Fixed)
        layout.addSpacerItem(spacer)  # Add another spacer between widgets

        layout.addWidget(self.btn3)

        self.setLayout(layout)
        self.setWindowTitle('QVBoxLayout Spacer Example')
        self.show()

if __name__ == '__main__':
    import sys
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

 


1. setContentsMargins(0,0,0,0) + setSpacing(0)

2. layout.addSpacerItem(QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum))

 

3. layout.addSpacerItem(QSpacerItem(40, 20, QSizePolicy.Minimum, QSizePolicy.Minimum)) 

4. layout.addSpacerItem(QSpacerItem(10, 20, QSizePolicy.Minimum, QSizePolicy.Minimum))   

        layout = QHBoxLayout()
        layout.addSpacerItem(QSpacerItem(10, 20, QSizePolicy.Minimum, QSizePolicy.Minimum))  
        layout.addWidget(self.btnAlignViewAll)
        layout.addWidget(self.btnAlignViewTable)
        layout.addWidget(self.btnAlignViewPackage)
        layout.addWidget(self.btnAlignViewTable2)
        layout.addWidget(self.btnAlignViewPackage2)
        layout.addSpacerItem(QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum))
        v_layout = QVBoxLayout()
        v_layout.setContentsMargins(10,5,0,0)
        v_layout.setSpacing(0)
        v_layout.addLayout(layout)
        v_layout.addWidget(self.spliter)
        self.setLayout(v_layout)
        self.setWindowFlags(Qt.FramelessWindowHint | Qt.Tool)
반응형