Programming/qt2026. 1. 13. 15:46

dialog 띄우고 show, hide 하는것도 방법이지만

layout 에다가 widget을 추가하고 layout을 stack 해서 새 창을 띄울 것들을 새로운 stack에 넣어서 하는 것도 방법이고

아니면 위젯을 스택해서 쓰는것도 방법일 듯 한데

구조적으로는 stackedlayout에 widget을 넣어 운영하는게 좀 더 맞는 듯?

 

QStackedLayout QStackedWidget
import sys, os

# Qt 바인딩을 PySide6 우선 사용하고, 실패 시 PyQt6 사용
qt_modules = None

# PySide6을 먼저 시도
try:
    from PySide6.QtWidgets import (
        QApplication, QWidget,
        QStackedLayout, QVBoxLayout,
        QLabel,
        QComboBox, 
    )
    from PySide6.QtGui import QPixmap
    qt_modules = 'PySide6'
except ImportError:
    # 실패 시 PyQt6 시도
    try:
        from PyQt6.QtWidgets import (
            QApplication, QWidget,
            QStackedLayout, QVBoxLayout,
            QLabel,
            QComboBox, 
        )
        from PyQt6.QtGui import QPixmap
        qt_modules = 'PyQt6'
    except ImportError:
        # 둘 다 실패하면 메시지 출력 후 종료
        print("There is no Qt Binding for Python.")
        sys.exit(1)

# 사용된 Qt 바인딩 이름 출력
print(f"Using {qt_modules} binding.")

# ------------------------------------

# 메인 윈도우 클래스 정의
class MW(QWidget):
    def __init__(self):
        super().__init__()
        self.init_ui()

    def init_ui(self):
        # 윈도우 타이틀 설정
        self.setWindowTitle("Ex Input Widgets")
        # 메인 위젯 및 레이아웃 구성
        self.setup_main_wnd()
        # 윈도우 표시
        self.show()

    def setup_main_wnd(self):
        # 현재 파일의 절대 경로 기준 디렉토리 경로 얻기
        fpath = os.path.dirname(
            os.path.abspath(__file__)
        )

        # 콤보박스에 표시될 페이지 이름들
        pages = ['faith', 'hope', 'love']

        # 각 페이지에 해당하는 이미지 파일 경로 리스트
        self.imgs = [
            os.path.join(fpath, 'img','faith.png'),
            os.path.join(fpath, 'img','hope.png'),
            os.path.join(fpath, 'img','love.png')
        ]

        # 콤보박스 생성 및 항목 추가
        combo_box = QComboBox()
        combo_box.addItems(pages)
        # 콤보박스 항목이 선택되면 change_page 함수 실행
        combo_box.activated.connect(self.change_page)

        # QStackedLayout 생성 (여러 페이지를 겹쳐서 보관, 하나만 보여줌)
        self.stacked_lm = QStackedLayout()

        # 페이지 수만큼 QLabel 생성 후 QStackedLayout에 추가
        for idx, c in enumerate(pages):
            label = self.setup_page(idx)  # QLabel을 생성하고 이미지 설정
            self.stacked_lm.addWidget(label)  # 스택에 추가

        # 수직 박스 레이아웃 생성
        v_box_lm = QVBoxLayout()
        v_box_lm.addWidget(combo_box)         # 콤보박스를 위에 추가
        # 스택 레이아웃을 아래에 추가
        # v_box_lm.addLayout(self.stacked_lm)  # 이 한줄로 아래 3개라인을 대체 가능.
        tmp_c = QWidget()
        tmp_c.setLayout(self.stacked_lm)
        v_box_lm.addWidget(tmp_c)

        # 최종 레이아웃을 윈도우에 설정
        self.setLayout(v_box_lm)

    # 페이지용 QLabel 설정 함수
    def setup_page(self, page_num):
        label = QLabel()
        pixmap = QPixmap(self.imgs[page_num])     # 해당 이미지 불러오기
        label.setPixmap(pixmap)                   # QLabel에 이미지 설정
        label.setScaledContents(True)             # QLabel 크기에 맞게 이미지 자동 조절
        return label

    # 콤보박스에서 선택된 인덱스에 해당하는 페이지를 보여줌
    def change_page(self, idx):
        self.stacked_lm.setCurrentIndex(idx)

# ------------------------------------

# 프로그램 진입점
if __name__ == "__main__":
    print(os.path.realpath(__file__))  # 현재 실행 중인 파일 경로 출력
    app = QApplication(sys.argv)       # QApplication 인스턴스 생성
    main_wnd = MW()                         # 메인 윈도우 생성
    sys.exit(app.exec())               # 이벤트 루프 실행

import sys, os

# Qt 바인딩을 PySide6 우선, PyQt6는 백업용
qt_modules = None

try:
    from PySide6.QtWidgets import (
        QApplication, QWidget, QLabel,
        QVBoxLayout, QComboBox, QStackedWidget
    )
    from PySide6.QtGui import QPixmap
    qt_modules = 'PySide6'
except ImportError:
    try:
        from PyQt6.QtWidgets import (
            QApplication, QWidget, QLabel,
            QVBoxLayout, QComboBox, QStackedWidget
        )
        from PyQt6.QtGui import QPixmap
        qt_modules = 'PyQt6'
    except ImportError:
        print("There is no Qt Binding for Python.")
        sys.exit(1)

print(f"Using {qt_modules} binding.")

# ------------------------------------

class MW(QWidget):
    def __init__(self):
        super().__init__()
        self.init_ui()

    def init_ui(self):
        self.setWindowTitle("Ex: QStackedWidget with ComboBox")
        self.setup_main_wnd()
        self.show()

    def setup_main_wnd(self):
        # 현재 스크립트 경로를 기준으로 이미지 파일 위치 설정
        fpath = os.path.dirname(os.path.abspath(__file__))

        # 페이지 이름과 이미지 경로 정의
        pages = ['faith', 'hope', 'love']
        self.imgs = [
            os.path.join(fpath, 'img/faith.png'),
            os.path.join(fpath, 'img/hope.png'),
            os.path.join(fpath, 'img/love.png')
        ]

        # 콤보박스 생성 및 페이지 이름 추가
        combo_box = QComboBox()
        combo_box.addItems(pages)
        combo_box.activated.connect(self.change_page)

        # QStackedWidget 생성
        self.stack_widget = QStackedWidget()

        # 각 페이지에 해당하는 QLabel + 이미지 추가
        for idx in range(len(pages)):
            label = QLabel()
            pixmap = QPixmap(self.imgs[idx])
            label.setPixmap(pixmap)
            label.setScaledContents(True)  # 이미지가 QLabel에 맞게 리사이즈됨
            self.stack_widget.addWidget(label)

        # 수직 레이아웃 구성: 콤보박스 위, 이미지 아래
        layout = QVBoxLayout()
        layout.addWidget(combo_box)
        layout.addWidget(self.stack_widget)

        self.setLayout(layout)

    # 콤보박스 인덱스 선택 시 보여줄 페이지 변경
    def change_page(self, idx):
        self.stack_widget.setCurrentIndex(idx)

# ------------------------------------

if __name__ == "__main__":
    print(os.path.realpath(__file__))
    app = QApplication(sys.argv)
    main_wnd = MW()
    sys.exit(app.exec())

[링크 : https://wikidocs.net/185879]

qstackedwidget

[링크 : https://wikidocs.net/162838]

[링크 : https://doc.qt.io/qt-6/qwidget.html]

[링크 : https://doc.qt.io/qt-6/qstackedwidget.html]

[링크 : https://qt-dev.com/board.php?board=qnaboard&page=4&category=1&command=body&no=758]

[링크 : https://hobbylife.tistory.com/entry/PySide6-QStackedWidget-완전-정복-–-클릭-이벤트와-사용법]

 

qstackedlayout

[링크 : https://m.blog.naver.com/raffiner/222027119916]

[링크 : https://doc.qt.io/qt-6/qstackedlayout.html]

'Programming > qt' 카테고리의 다른 글

qt quick websocket  (0) 2026.01.14
qt qml loader  (0) 2026.01.14
qt quick 예제 calqlatr 코드분석  (0) 2026.01.13
qt qml view  (0) 2026.01.13
qt quick 이미지 클릭  (0) 2026.01.12
Posted by 구차니