/ PROGRAMMING, PYTHON, GUI

PyQt6 Layouts

창 내에 여러 가지 위젯이 공존할 수 있도록 레이아웃을 생성해 보자.

PyQt 정보


레이아웃

Qt에서는 4개의 기본적인 레이아웃을 제공한다.

레이아웃 설명
QHBoxLayout 선형 가로(Horizontal) 레이아웃
QVBoxLayout 선형 세로(Vertical) 레이아웃
QGridLayout XxY 크기의 indexable한 그리드
QStackedLayout z 개의 겹쳐진 스택 구조

Qt designer 라는 도구를 이용해 인터페이스를 편리하게 구성할 수도 있다. 이 글에서는 기반 구조를 이해하기 위해 코드로 접근한다.

레이아웃을 창에 추가하기 위해서 레이아웃을 담을 더미용 빈 위젯 QWidget 이 필요하다.

해당 QWidget 위젯을 메인 윈도우의 .setCentralWidget 위젯의 argument로 넘겨줌으로써 레이아웃이 적용된 위젯을 표시할 수 있다.


레이아웃 Nesting

레이아웃의 .addLayout 메소드를 통해 다른 레이아웃을 nesting하는 것이 가능하다.

class Color(QWidget): # 커스텀 위젯 (추후 자세히 다룰 예정)

    def __init__(self, color):
        super(Color, self).__init__()
        self.setAutoFillBackground(True)

        palette = self.palette()
        palette.setColor(QPalette.ColorRole.Window, QColor(color))
        self.setPalette(palette)

class MainWindow(QMainWindow):

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

        self.setWindowTitle("My App")

        layout1 = QHBoxLayout()
        layout2 = QVBoxLayout()
        layout3 = QVBoxLayout()

        layout2.addWidget(Color('red'))
        layout2.addWidget(Color('yellow'))
        layout2.addWidget(Color('purple'))

        layout1.addLayout( layout2 )

        layout1.addWidget(Color('green'))

        layout3.addWidget(Color('red'))
        layout3.addWidget(Color('purple'))

        layout1.addLayout( layout3 )

        widget = QWidget()
        widget.setLayout(layout1)
        self.setCentralWidget(widget)

위 코드에서는 가로 레이아웃인 layout1에 세로 레이아웃 layout2, layout3 을 추가하여 layout2layout3 내의 위젯들은 세로로 배치되고 레이아웃 자체는 부모 레이아웃인 layout1에 의해 layout1 에 속한 위젯들과 함께 가로로 배치되도록 한다.

.setContentMargins를 통해 레이아웃 간의 margin을 설정할 수 있으며, .setSpacing을 통해 요소들 사이의 빈 공간을 조절할 수 있다.


QGridLayout

서로 다른 크기의 위젯이 정해진 공간 내에 정렬되도록 하려면 QGridLayout 이 유용하다.

위젯을 추가할 때, 위젯이 추가될 행과 열을 순서대로 추가 argument로써 넘겨 주면 된다. 이때, 레이아웃에는 빈 공간이 존재할 수 있다.


QStackedLayout

위젯을 같은 위치에 겹쳐 놓을 수 있다. 탭 인터페이스를 구현할 때 유용하다. 정확히 같은 기능을 하는 QStackedWidget 이라는 컨테이너 위젯도 있는데, .setCentralWidget 으로 넘겨줄 때 유용하다.

.setCurrentIndex()를 통해 인덱스로 현재 보여줄 위젯을 지정하거나, .setCurrentWidget()을 통해 보여줄 위젯을 직접 넘겨줄 수 있다.

Qt는 탭 인터페이스를 더욱 간편하게 구현할 수 있는 내장 TabWidget인 QTabWidget 을 제공한다.


참고 문헌