본문으로 바로가기
반응형

탭은 제한된 화면에 여러 컨트롤들을 올리기 위해 만들어진 레이아웃 입니다. 의미 있는 섹션으로 나눠서 컨트롤들을 배치할 수 있기 때문에 사용자뿐만 아니라 설계 측면에서도 유용한 형태라 자주 사용합니다. PyQt5 에서는 탭 구현을 위해 QTabWidget 위젯을 제공합니다.

 

탭 생성을 위해서 QTabWidget 을 사용합니다. QTabWidget 위젯의 addTab() 함수를 이용하면 탭 추가가 가능합니다. addTab() 의 인수는 QWidget() 로 객체를 생성합니다.

from PyQt5.QtWidgets import QWidget, QTabWidget

# Tab Widget
tabs = QTabWidget()
tabs.addTab(QWidget(), 'One')
tabs.addTab(QWidget(), 'Two')
tabs.addTab(QWidget(), 'Three')

 

탭을 추가한 전체 소스는 다음과 같습니다.

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


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

        # Tab Widget
        tabs = QTabWidget()
        tabs.addTab(QWidget(), 'One')
        tabs.addTab(QWidget(), 'Two')
        tabs.addTab(QWidget(), 'Three')

        # QMainWindow 추가
        self.setCentralWidget(tabs)

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

 

실행결과는 다음과 같습니다. 3개의 탭이 추가되었으며, addTab() 의 매개변수로 넘긴 이름이 표시되었습니다. 다음은 추가된 탭 레이아웃 안에 컨트롤들을 올려 보겠습니다.

 

추가하는 방법은 동일하게 QTabWidget addTab() 함수를 이용합니다. 단지 컨트롤을 구성하는 함수를 만들어서 리턴값을 addTab() 의 매개변수로 넘길 것입니다. 형태는 아래와 같습니다.

# Tab Widget
tabs = QTabWidget()
tabs.addTab(self.make_tab1(), 'One')
tabs.addTab(self.make_tab2(), 'Two')
tabs.addTab(self.make_tab3(), 'Three')

 

addTab() 매개변수로 입력한 함수는 QWidget 객체를 리턴합니다. 그리고 함수 내부에서는 QVBoxLayout(), QHBoxLayout() 같은 Layout 위젯을 이용해서 컨트롤을 구성한 후 QWidget setLayout() 함수에 추가합니다. 아래는 첫 번째 탭을 구성하는 함수 내부의 소스입니다.

# 첫번째 탭 생성함수
def make_tab1(self):
    # 버튼 객체 만들기
    button1 = QPushButton('버튼1', self)
    button2 = QPushButton('버튼2', self)
    button3 = QPushButton('버튼3', self)

    # 레이아웃 만들기
    vbox = QVBoxLayout()
    vbox.addWidget(button1)
    vbox.addWidget(button2)
    vbox.addWidget(button3)

    # 위젯에 레이아웃 추가하기
    tab = QWidget()
    tab.setLayout(vbox)
    return tab

 

이런 식으로 3개의 함수를 만들어서 QTabWidget() 에 추가하고 완성은 전체 소스는 다음과 같습니다.

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


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

        # Tab Widget
        tabs = QTabWidget()
        tabs.addTab(self.make_tab1(), 'One')
        tabs.addTab(self.make_tab2(), 'Two')
        tabs.addTab(self.make_tab3(), 'Three')

        # QMainWindow 추가
        self.setCentralWidget(tabs)

    # 첫번째 탭 생성함수
    def make_tab1(self):
        # 버튼 객체 만들기
        button1 = QPushButton('버튼1', self)
        button2 = QPushButton('버튼2', self)
        button3 = QPushButton('버튼3', self)

        # 레이아웃 만들기
        vbox = QVBoxLayout()
        vbox.addWidget(button1)
        vbox.addWidget(button2)
        vbox.addWidget(button3)

        # 위젯에 레이아웃 추가하기
        tab = QWidget()
        tab.setLayout(vbox)
        return tab

    def make_tab2(self):
        # 버튼 객체 만들기
        check1 = QCheckBox('체크버튼1', self)
        check2 = QCheckBox('체크버튼2', self)
        check3 = QCheckBox('체트버튼3', self)

        # 레이아웃 만들기
        vbox = QVBoxLayout()
        vbox.addWidget(check1)
        vbox.addWidget(check2)
        vbox.addWidget(check3)

        # 위젯에 레이아웃 추가하기
        tab = QWidget()
        tab.setLayout(vbox)
        return tab

    def make_tab3(self):
        # radio 버튼
        radio1 = QRadioButton('레디오버튼1', self)
        radio2 = QRadioButton('레디오버튼2', self)
        radio3 = QRadioButton('레디오버튼3', self)

        # 레이아웃 만들기
        vbox = QVBoxLayout()
        vbox.addWidget(radio1)
        vbox.addWidget(radio2)
        vbox.addWidget(radio3)

        # 위젯에 레이아웃 추가하기
        tab = QWidget()
        tab.setLayout(vbox)
        return tab

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

 

실행한 결과로 첫 번째 탭에 버튼을, 두 번째 탭에 체크박스, 세 번째 탭에 라디오 박스가 들어가 있는 것을 확인할 수 있습니다.

반응형