PyQt6 Layouts
창 내에 여러 가지 위젯이 공존할 수 있도록 레이아웃을 생성해 보자.
PyQt 정보
- 1. PyQt6을 이용하여 파이썬으로 GUI 어플리케이션 만들기
- 2. PyQt6 Signals, Slots & Events
- 3. Qt6 Widgets
- 4. PyQt6 Layouts
- 5. PyQt6 + Qt Designer
- 6. Qt의 Model View
- 7. PyQt6의 MultiThreading
레이아웃
Qt에서는 4개의 기본적인 레이아웃을 제공한다.
레이아웃 | 설명 |
---|---|
QHBoxLayout |
선형 가로(Horizontal) 레이아웃 |
QVBoxLayout |
선형 세로(Vertical) 레이아웃 |
QGridLayout |
X xY 크기의 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
을 추가하여 layout2
와 layout3
내의 위젯들은 세로로 배치되고 레이아웃 자체는 부모 레이아웃인 layout1
에 의해 layout1
에 속한 위젯들과 함께 가로로 배치되도록 한다.
.setContentMargins
를 통해 레이아웃 간의 margin을 설정할 수 있으며, .setSpacing
을 통해 요소들 사이의 빈 공간을 조절할 수 있다.
QGridLayout
서로 다른 크기의 위젯이 정해진 공간 내에 정렬되도록 하려면 QGridLayout
이 유용하다.
위젯을 추가할 때, 위젯이 추가될 행과 열을 순서대로 추가 argument로써 넘겨 주면 된다. 이때, 레이아웃에는 빈 공간이 존재할 수 있다.
QStackedLayout
위젯을 같은 위치에 겹쳐 놓을 수 있다. 탭 인터페이스를 구현할 때 유용하다. 정확히 같은 기능을 하는 QStackedWidget
이라는 컨테이너 위젯도 있는데, .setCentralWidget
으로 넘겨줄 때 유용하다.
.setCurrentIndex()
를 통해 인덱스로 현재 보여줄 위젯을 지정하거나, .setCurrentWidget()
을 통해 보여줄 위젯을 직접 넘겨줄 수 있다.
Qt는 탭 인터페이스를 더욱 간편하게 구현할 수 있는 내장 TabWidget인 QTabWidget
을 제공한다.