PyQt. 사용자 정의 시그널
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 해 두었다.
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_()