본문 바로가기

Language/python

Qt Designer와 PySide 사용하여 GUI 프로그래밍 하기 2/2

이전 글 에서 Qt Designer를 사용하여 TestWidget.ui를 만들었으며 해당 파일로부터 TestWidget.py 스크립트를 만들었다.


이번에는 만들어진 TestWidget.py를 기반으로 pushButton에 "clicked()" SIGNAL을 추가하여 클릭시 showMessage 함수가 호출되도록 구성할 것이다. 기본적인 동작만 안다면 확장하는 것은 크게 어렵지 않을 것이다.


Step1. Qt Designer로 GUI를 구성하여 TestWidget.ui 파일 생성

Step2. TestWidget.ui로 부터 TestWidget.py 생성

Step3. TestMainDialog.py를 만들어 1번에서 만든 pushButton에 "clicked()" SIGNAL을 showMessage 함수에 연결되도록 구성한다.

Step4. 수행하여 결과를 확인한다.


1. QDialog와 TestWidget을 상속받는 TestMainDiaglog 클래스를 아래와 같이 구성한다.


   -> Line 15 : class TestMainDialog(QDialog, TestWidget.Ui_Form 

우리가 구성하려는 GUI의 뼈대를 가지고 있는 TestWidget.Ui_Form을 상속받아서 사용한다. TestMainDialog안에서 TestWidget.Ui_Form이 가지고 있는 모든 멤버에 접근할 수 있다. 이번 글에서는 pushButton에 SIGNAL을 등록할 것이다.


   -> Line 16 : def __init__(self, parent=None)

생성자 처리에 약간 신경을 쓰자. super 함수로 부모 클래스의 생성자들을 호출한다. 또한, 중요한 것이 TestWidget.Ui_Form의 setupUi 함수를 반드시 호출한다.


   -> Line 20 : self.connect(self.pushButton, SIGNAL("clicked()"), self.showMessage)

pushButton에 "clicked()" SIGNAL을 등록하여 showMessage 함수에 연결해주는 구문이다.


   -> Line 22 : def showMessage(self):

pushButton의 "clicked()" SIGNAL 발생시 호출되는 콜백함수이다. 간단히 정보 메시지를 호출한다.


2. Command 창에서 TestMainDialog를 수행하여 버튼을 클릭하여 본다.


해당 SIGNAL 처리가 잘되고 있음을 알수 있다.


BUT!! 잘되는것 같지만, 사실 큰 문제점이 있다. showMessage 콜백함수에서 시간이 걸리는 동작을 수행하게 되면, UI 프로그램 전체가 먹통이 될 것이다. 아래처럼 showMessage 함수에 time.sleep(10) 을 넣어서 수행해보자. 


아래와 같이 10초동안 GUI가 먹통되는 것을 확인할 수 있다.


이를 해결하기 위해 Thread를 사용하여 해결해야 한다. 이것은 다음 기회에...