반응형

GUI를 만들 때 모든 결과를 한 창에 담지 않는이상 반드시 창 전환이 필요한 순간이 온다.

예를들면 로그인 창을 구현한다고 할때, 로그인 정보가 확인되면 새로운 창을 열때나 

버튼 클릭에 따라 새 창을 켜고자 할때 등등이다. 이럴 때 필요한 창 전환을 한번 해보자.

 

먼저 mainwindow.ui와 secondwindow.ui를 만들어 보자. 이때 두번째 창은 dialog로하든 widget으로 하든 상관없다.

(여기서는 Widgetd으로 생성했다.)

mainwindow에는 btn_main 버튼을, secondwindow에는 btn_second 버튼을 생성해두자.

그리고 저저번장에서 배웠던 기본 폼에 2번째 창의 폼도 추가해준다.

https://trading-for-chicken.tistory.com/25

 

01. Qtdesigner를통한 Pyqt5 기본 세팅하기.

Pyqt5를 다뤄본 사람들이라면 알겠지만, 레이아웃 요소 하나하나를 코딩하는것 보다 Qtdesigner 툴을 이용하면 훨씬 편하다. 다만, 코딩보단 범용성이 떨어지기때문에 때에 따라서는 사용상 어려움

trading-for-chicken.tistory.com

import os
import sys

from PyQt5.QtWidgets import *
from PyQt5 import uic

def resource_path(relative_path):
    base_path = getattr(sys, "_MEIPASS", os.path.dirname(os.path.abspath(__file__)))
    return os.path.join(base_path, relative_path)

form = resource_path('mainwindow.ui')
form_class = uic.loadUiType(form)[0]

#######################추가############################
form_second = resource_path('secondwindow.ui')
form_secondwindow = uic.loadUiType(form_second)[0]
#######################################################

class WindowClass(QMainWindow, form_class):
    def __init__(self):
        super().__init__()
        self.setupUi(self)

#######################추가############################
class secondwindow(QDialog,QWidget,form_secondwindow):
    def __init__(self):
        super(secondwindow,self).__init__()
        self.initUi()
        self.show()
#######################################################

if __name__ == '__main__':
    app = QApplication(sys.argv)
    myWindow = WindowClass()
    myWindow.show()
    app.exec_()

그리고 각 창에 대한 class에 각 버튼에 대한 함수를 만들어주고 저저번 장에 배운대로 Qtdesigner를 통해 Signal-Slot을 연결해준다

https://trading-for-chicken.tistory.com/26

 

02. QtDesigner에서 시그널-슬롯 연결하기.

저번 장에서 PyQt5 기본 세팅 및 시그널-슬롯 연결을 해보았다. https://trading-for-chicken.tistory.com/25 01. Qtdesigner를통한 Pyqt5 기본 세팅하기. Pyqt5를 다뤄본 사람들이라면 알겠지만, 레이아웃 요소..

trading-for-chicken.tistory.com

class WindowClass(QMainWindow, form_class):
    def __init__(self):
        super().__init__()
        self.setupUi(self)
	# 추가
    def btn_main_to_second(self):
        pass

class secondwindow(QDialog,QWidget,form_secondwindow):
    def __init__(self):
        super(secondwindow,self).__init__()
        self.initUi()
        self.show()
        
    def initUi(self):
        self.setupUi(self)
	# 추가
    def btn_second_to_main(self):
        pass

이제 main에서 second창으로 가는 함수를 작성해주고, second창에서 main창으로 가는 함수를 작성해준다.

import os
import sys

from PyQt5.QtWidgets import *
from PyQt5 import uic

def resource_path(relative_path):
    base_path = getattr(sys, "_MEIPASS", os.path.dirname(os.path.abspath(__file__)))
    return os.path.join(base_path, relative_path)

form = resource_path('mainwindow.ui')
form_class = uic.loadUiType(form)[0]

form_second = resource_path('secondwindow.ui')
form_secondwindow = uic.loadUiType(form_second)[0]


class WindowClass(QMainWindow, form_class):
    def __init__(self):
        super().__init__()
        self.setupUi(self)

    def btn_main_to_second(self):
        self.hide()                     # 메인윈도우 숨김
        self.second = secondwindow()    #
        self.second.exec()              # 두번째 창을 닫을 때 까지 기다림
        self.show()                     # 두번째 창을 닫으면 다시 첫 번째 창이 보여짐짐

class secondwindow(QDialog,QWidget,form_secondwindow):
    def __init__(self):
        super(secondwindow,self).__init__()
        self.initUi()
        self.show()

    def initUi(self):
        self.setupUi(self)

    def btn_second_to_main(self):
        self.close()                    #클릭시 종료됨.

if __name__ == '__main__':
    app = QApplication(sys.argv)
    myWindow = WindowClass()
    myWindow.show()
    app.exec_()

원리는 이렇다. main창의 버튼을 누르면 main창이 hide된다. 그리고 second.exec( )를 통해 second창을 연다. 그리고

secondwindow 클래스에서 루프를 돌다가 second창의 버튼을 누르게될경우 close( )를통해 종료되고 

def btn_main_to_second( )메서드의 self.show를 통해 main창이 다시 켜지는 것이다. 실행하면 아래와 같다.

위를 활용하면 하위창을 계속 만들거나, 여러 하위창을 동시에 만들수도 있다. 한번 활용해보기 바란다.

반응형

+ 최근 글