본문 바로가기
프로그래밍 관련/PyQt

PyQt. QstackedWidget

by 존버매니아.임베디드 개발자 2021. 10. 31.
반응형

 1. 개요

 QStackWidget 이 있고, 그 하위에 Qwidget 들이 여러개 포함되는 형태로 구성됨

 똑같은 크기의 도화지에 여러개의 Widget을 전부 쌓아놓고

한번에 1개씩만 유저에게 보여주는 Widget이 stack Widget이다.


2. 하위 page 갯수 늘리기, 순서바꾸기 

 


3. 현재 선택된 page 변경하는 메소드

import sys
from PyQt5.QtWidgets import *
from PyQt5 import uic

#UI파일 연결
#단, UI파일은 Python 코드 파일과 같은 디렉토리에 위치해야한다.
form_class = uic.loadUiType("test_stack.ui")[0]

#화면을 띄우는데 사용되는 Class 선언
class WindowClass(QMainWindow, form_class) :
    def __init__(self) :
        super().__init__()
        self.setupUi(self)

        self.stackedWidget:QStackedWidget # class type 지정해주기

        self.stackedWidget.setCurrentIndex(0)            
      

if __name__ == "__main__" :
    #QApplication : 프로그램을 실행시켜주는 클래스
    app = QApplication(sys.argv) 

    #WindowClass의 인스턴스 생성
    myWindow = WindowClass() 

    #프로그램 화면을 보여주는 코드
    myWindow.show()

    #프로그램을 이벤트루프로 진입시키는(프로그램을 작동시키는) 코드
    app.exec_()

예시코드에서 핵심은

QStackedwidget 의 setCurrentIndex(페이지번호) 메소드이다.

적절한 버튼을 만들어서 setCurrentIndex 메소드를 호출하는 형태로 UI를 구성하면 될 것이다. 

 


QT 디자이너 안쓴 코드 예시

import sys
from PyQt5.QtWidgets import *
   
    
class MyWindow(QMainWindow):
         
    def __init__(self):
        super().__init__()
        self.setWindowTitle("PyStock")
        self.setGeometry(830, 100, 700, 700)

        btn1 = QPushButton("Stack Page1",self)
        btn1.move(500,0)
        btn1.clicked.connect(self.btn_fun1)

        btn2 = QPushButton("Stack Page2",self)
        btn2.move(500,30)
        btn2.clicked.connect(self.btn_fun2)

        # Stack 생성    
        self.stack = QStackedWidget(self)
        self.stack.setGeometry(0,0,500,500)
        self.stack.setFrameShape(QFrame.Box)

        # Stack에서 사용될 페이지로 위젯2개를 만들었음
        self.stack.addWidget(QWidget())
        self.stack.addWidget(QWidget())

        # 0번 위젯에 트리2개를 넣음
        tree1=QTreeWidget(self.stack.widget(0))
        tree1.setGeometry(0, 0, 150, 100)        
        tree2=QTreeWidget(self.stack.widget(0))
        tree2.setGeometry(0,120,150,100)

        # 1번 위젯에 
        line=QLineEdit(self.stack.widget(1))
        line.setGeometry(0,0,100,100)

        btn_instack1 =QPushButton("1번 위젯 버튼 1",self.stack.widget(1))
        btn_instack1.move(120,0)
        btn_instack2= QPushButton("1번 위젯 버튼 2",self.stack.widget(1))
        btn_instack2.move(120,30)
        

    def btn_fun1(self):
            self.stack.setCurrentIndex(0)
            
    def btn_fun2(self):
            self.stack.setCurrentIndex(1)

      

if __name__ == "__main__":
    app = QApplication(sys.argv)
    myWindow = MyWindow()
    myWindow.show()

    app.exec_()

핵심 메소드1 : QStackedWidget 를 사용해서 스택 위젯을 생성

핵심 메소드2 : QStackedWidget 클래스의 addWidget 메소드를 사용해서 위젯을 한 개씩 추가

핵심 메소드3 : QStackedWidget 클래스의 widget 메소드를 사용하면 각각의 페에지를 리턴받을 수 있다.

핵심 메소드4 : QStackedWidget 클래스의  setCurrentIndex() 메소드로 현재 GUI 창에 열려있는 Widget 뭘로할지

고르기

 

반응형