본문으로 바로가기
반응형

QBoxLayout 은 공간을 행과열로 나누어서 일정한 방향으로 위젯을 배치하는데 사용하는 레이아웃입니다. 주로 QBoxLayout 을 상속받아 만든 QVBoxLayout QHBoxLayout 을 사용합니다. QVBoxLayout V Vertical 의 약자로 세로를 뜻합니다. 레이아웃에 추가한 컨트롤을 일정한 간격을 유지하면서 세로로 배치합니다. 반대로 QHBoxLayout Horizontal 을 뜻하며, 가로 방향으로 배치합니다.

 

1. QVBoxLayout

 

먼저 QVBoxLayout 알아보겠습니다. QVBoxLayout 추가한 컨트롤을 세로 방향으로 배치할 때 사용하는 컨트롤입니다. QVBoxLayout 내부에 들어가는 위젯은 버튼으로 하겠습니다. 아래 소스를 통해서 알 수 있듯이 별 다른 설정이 필요없습니다. 그냥 addWidget() 함수를 사용해서 추가하면 자동으로 배치가 됩니다. QVBoxLayout 은 추가한 버튼이 세로로 나열이 되겠죠. 마지막으로 화면에 레이아웃을 추가하기 위해 setLayout() 함수를 사용했습니다.

 

주의해서 봐야할 것은 MainWindow 가 상속받은 클래스는 QWidget 입니다. QWidget 이나 QDialog 에 레이아웃을 올릴 때는 setLayout() 함수로 가능합니다. 하지만 QMainWindow 을 상속받아 만든 클래스는 화면에 추가하는 방식이 조금 다릅니다.

#!/usr/bin/env python3
import sys
from PyQt5.QtWidgets import QVBoxLayout, \
    QApplication, QPushButton,QWidget


class MainWindow(QWidget):
    def __init__(self):
        super().__init__()
        # 윈도우 설정
        self.setGeometry(50,50,400,300)  # x, y, w, h
        self.setWindowTitle('Status Window')

        pb1 = QPushButton('버튼1', self)
        pb2 = QPushButton('버튼2', self)
        pb3 = QPushButton('버튼3', self)

        boxlayout = QVBoxLayout()
        boxlayout.addWidget(pb1)
        boxlayout.addWidget(pb2)
        boxlayout.addWidget(pb3)

        self.setLayout(boxlayout)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    mainWindow = MainWindow()
    mainWindow.show()
    sys.exit(app.exec_())

 

QWidget 이나 QDialog 이 아닌 QMainWindow 를 상속받아 화면을 구현할 때는 한단계 더 작업을 거쳐야 합니다. QMainWindow QVBoxLayout 을 바로 추가할 수 없기 때문에 QWidget 을 만들고 MainWindow setCentralWidget() 함수로 추가해야 정상적으로 화면에서 볼 수 있습니다. 위에서 보았던 소스와 달라지는 부분은 다음과 같습니다. 상속 클래스를 QMainWindow 로 바꾸고 setLayout() 삭제한 후 아래 소스를 추가합니다.

# 1. QVBoxLayout 을 생성한다.
boxlayout = QVBoxLayout()
boxlayout.addWidget(pb1)
boxlayout.addWidget(pb2)
boxlayout.addWidget(pb3)

# 2. QWidget 에 QVBoxLayout 객체를 추가한다.
widget = QWidget()
widget.setLayout(boxlayout)

# 3. QMainWindow 에 Widget 을 추가한다 
self.setCentralWidget(widget)

 

2. QHBoxLayout

 

다음은 QHBoxLayout 레이아웃입니다. 위젯 컨트롤을 일정한 간격으로 가로 배치를 하고 싶다면 QVBoxLayout QHBoxLayout 으로 변경합니다. 변경해야 할 다른 옵션은 없습니다. 단지 클래스만 변경하면 배치 방향을 가로/세로로 전환할 수 있습니다.

from PyQt5.QtWidgets import QHBoxLayout

# 1. QHBoxLayout 을 생성한다.
boxlayout = QHBoxLayout()
boxlayout.addWidget(pb1)
boxlayout.addWidget(pb2)
boxlayout.addWidget(pb3)

# 2. QWidget 에 QVBoxLayout 객체를 추가한다.
widget = QWidget()
widget.setLayout(boxlayout)

# 3. QMainWindow 에 Widget 을 추가한다
self.setCentralWidget(widget)

 

위에서 설명한 전체 소스는 다음과 같습니다.

#!/usr/bin/env python3
import sys
from PyQt5.QtWidgets import QHBoxLayout,  \
    QApplication, QPushButton,QMainWindow, QWidget


class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        # 윈도우 설정
        self.setGeometry(50,50,400,300)  # x, y, w, h
        self.setWindowTitle('Status Window')

        pb1 = QPushButton('버튼1', self)
        pb2 = QPushButton('버튼2', self)
        pb3 = QPushButton('버튼3', self)

        # 1. QHBoxLayout 을 생성한다.
        boxlayout = QHBoxLayout()
        boxlayout.addWidget(pb1)
        boxlayout.addWidget(pb2)
        boxlayout.addWidget(pb3)

        # 2. QWidget 에 QVBoxLayout 객체를 추가한다.
        widget = QWidget()
        widget.setLayout(boxlayout)

        # 3. QMainWindow 에 Widget 을 추가한다
        self.setCentralWidget(widget)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    mainWindow = MainWindow()
    mainWindow.show()
    sys.exit(app.exec_())
반응형