GUI를 만들 때 모든 결과를 한 창에 담지 않는이상 반드시 창 전환이 필요한 순간이 온다.
예를들면 로그인 창을 구현한다고 할때, 로그인 정보가 확인되면 새로운 창을 열때나
버튼 클릭에 따라 새 창을 켜고자 할때 등등이다. 이럴 때 필요한 창 전환을 한번 해보자.
먼저 mainwindow.ui와 secondwindow.ui를 만들어 보자. 이때 두번째 창은 dialog로하든 widget으로 하든 상관없다.
(여기서는 Widgetd으로 생성했다.)
mainwindow에는 btn_main 버튼을, secondwindow에는 btn_second 버튼을 생성해두자.
그리고 저저번장에서 배웠던 기본 폼에 2번째 창의 폼도 추가해준다.
https://trading-for-chicken.tistory.com/25
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
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창이 다시 켜지는 것이다. 실행하면 아래와 같다.
위를 활용하면 하위창을 계속 만들거나, 여러 하위창을 동시에 만들수도 있다. 한번 활용해보기 바란다.
'Pyqt5로 GUI만들기' 카테고리의 다른 글
05. [PyQt5] QProgressBar를 통해 로딩바 만들기 : 기본 로딩바 만들기 (0) | 2021.10.12 |
---|---|
04. [PyQt5] Qtimer 사용법. 시간마다 특정 행동 반복하기. (0) | 2021.10.12 |
02. [PyQt5] QtDesigner에서 시그널-슬롯 연결하기. (1) | 2021.10.06 |
01. [PyQt5] Qtdesigner를통한 Pyqt5 기본 세팅하기. (0) | 2021.10.06 |