03. [PyQt5] qtdesigner를 이용하여 창 전환 하기.
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창이 다시 켜지는 것이다. 실행하면 아래와 같다.
위를 활용하면 하위창을 계속 만들거나, 여러 하위창을 동시에 만들수도 있다. 한번 활용해보기 바란다.