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

PyQt. 사용자 정의 시그널

by 존버매니아.임베디드 개발자 2022. 6. 15.
반응형

https://wikidocs.net/70990 내용 공부한 것임


사용자 정의 시그널 사용할 때 pyqtSignal이라는 클래스를 사용하는데,

참고로 이 클래스는 QtCore에 정의되어있음

적절하게 Import 해서 사용하면 됨.

아래 예시 코드의 경우 from PyQt5.Qtcore import *

로 import를 해서 앞에 수식어 없이 그냥 곧바로 pyqtSignal 이라고 사용했다.


아래 코드 예시를 보면 쉽게 이해할 수 있을거라 생각하는데 그래도 부연설명 추가.

사용자정의 시그널을 만드는 방법은

일단 pyqtSignal class를 사용해서 객체를 만든다.

객체를 만들 때, 인풋 파라미터에 대해서 정의할 수 있는데 여기서 정의하는 파라미터는 곧

시그널이 슬롯으로 전달 될 떄 전달될 데이터를 의미한다. 

암튼 이렇게 객체를 생성하고 난 후,

emit 이라는 메소드를 호출하면 이것이 곧 시그널을 전달하는 것이 된다.

 

이제 위에서 말한 시그널을 넘겨받은 Slot을 만들자.

 

앞에서 만든 객체의 connect method를 사용해서 시그널이 왔을 떄 실행될 메소드를 지정할 수 있다.

이게 슬롯 지정 끝이다.

 

아래 예시 코드는

MyThread라는 스레드를 하나 만들었는데

이 쓰레드가 1초에 한번씩 사용자 정의 시그널 2개를 main Gui에 날려준다.

시그널 1개는 넘겨주는 데이터 없이 그냥 시그널만 보내고

시그널 1개는 2개의 데이터를 넘겨주는 시그널이다.

 

한편, Main window에서는 위 시그널을 받으면 각각 아래와 같은 Function을 실행하도록 connect 해 두었다.

fun_slot_from_Thread
 
fun_slot_para2_from_Thread

 

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import Qt
from PyQt5.QtCore import QThread
from PyQt5.QtCore import *
import time


class MyThread(QThread):
    cnt=0
    user_signal = pyqtSignal()  # 사용자 정의 시그널 1 생성
    user_signal_para2 = pyqtSignal(int , float) # 사용자 정의 시그널 2 생성

    def __init__(self):
        super().__init__()      
   
    def run(self):
        
        while True:
            self.cnt=self.cnt+1
            print("Thread running %d" %self.cnt)
            self.user_signal.emit()  #사용자 정의 시그널 1 발생
            self.user_signal_para2.emit(self.cnt,self.cnt) 2사용자 정의 시그널 2 발생
            time.sleep(1)


class MyWindow(QMainWindow):
         
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Test")
        self.setGeometry(1000, 200, 300, 300)

        self.Thread1 = MyThread()
        self.Thread1.user_signal.connect(self.fun_slot_from_Thread) #사용자 정의 시그널1 슬롯 Connect
        self.Thread1.user_signal_para2.connect(self.fun_slot_para2_from_Thread)  #사용자 정의 시그널2 슬롯 Connect

        self.Thread1.start()

    def fun_slot_from_Thread(self):  #사용자 정의 시그널1에 connect된 function
        print("user defined slot receive")
    

    def fun_slot_para2_from_Thread(self,data1,data2):#사용자 정의 시그널1에 connect된 function
        print("user defined slot 2 receive")
        print("data1 is %d" %data1)
        print("data2 is %f" %data2)


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

    app.exec_()
반응형