PyQt. 시그널 슬롯에 대하여
개요
Pyqt를 사용하여 프로그램이 실행되면 gui 창이 계속 떠있게 되는데 이것은 말하자면 일종의 쓰레드에 gui 객체가 계속 돌고있는 것임.
이 쓰레드에서 돌고있는 객체에게 특정한 이벤트가 발생했을때 신호를 전달하는게 '시그널'임.
슬롯은 이러한 시그널을 받았을때 발생하는 동작(Reaction)을 의미함.
가장 간단한 시그널 슬롯의 예시로 버튼 이벤트가 있음.
유저가 버튼을 클릭하는게 시그널이고, 이 버튼에 connect 시켜놓은 function이 슬롯이 된다.
위젯들은 각자 다양한 시그널들을 갖고있다. 이것은 위젯마다 각자 다른걸 갖고 있어서 여기서 일일이 설명하진 않는다.
대표적 예시를 몇가지 들자면 push button의 클릭.
테이블이나 트리에서 특정 데이터가 선택됐을때 등등 다양한 시그널들이 위젯마다 정의돼있다.
그리고 유저가 임의로 시그널을 만들수도 있다. 이때 필요에 따라 시그널을 줄때 특정한 데이터를 슬롯에게 전달 할 수도 있다.
시그널 직접 공부해서 활용하는 방법 . with QTableWidget Class를 예시로 들어서
특정 위젯에 어떤 시그널들이 있는지 보려면 Qt 공홈을 참고하면되는데 https://doc.qt.io/
위 사진의 페이지는 QTableWidget Class를 설명하는 page인데, 저기서 signal 이라고 검색해보면 아래와 같은 부분이 있다.
QT는 메소드들의 이름을 보면 대강 뭐하는 기능인지 알 수 있도록 잘만들어두었다. 아주 큰 장점이다.
초록색으로 표시된 위 메소드들을 클릭해보면 뭐하는 용도인지도 설명이 되어있다.
일단 위 메소드 중에 cellClicked 라는 시그널이 뭐냐면 테이블 위젯에서 아무거나 셀이 클릭되면 발생되는 시그널이다.
그리고 , 시그널 메소드에 적혀있는 파라미터는, 해당 시그널이 발생될때 전달되는 정보다.
무슨 말이냐면, cellClicked 시그널이 발생되면, 그 클릭된 시그널의 행 번호, 열번호도 같이 전달된다는 소리다.
그래서 이 시그널을 어떤식으로 활용하냐면
해당 시그널이 발생했을 때, 어떤 Function이 동작되도록 우리가 connect 해주면된다.
아래 예시 코드를 보자
import sys
from PyQt5.QtWidgets import *
from PyQt5 import QtCore
class MyWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setupUI()
def setupUI(self):
self.setGeometry(800, 200, 800, 300)
self.ta1 = QTableWidget(self)
self.ta1.resize(400, 500)
self.ta1.setColumnCount(3)
table_column=["첫번째 열" , "두번째 열" , "Third 열"]
self.ta1.setHorizontalHeaderLabels(table_column)
self.ta1.cellClicked.connect(self.fun_cellClicked)
#행 2개 추가
self.ta1.setRowCount(2)
#추가된 행에 데이터 채워넣음
self.ta1.setItem(0, 0, QTableWidgetItem("(0,0)"))
self.ta1.setItem(0, 1, QTableWidgetItem("(0,1)"))
self.ta1.setItem(1, 0, QTableWidgetItem("(1,0)"))
self.ta1.setItem(1, 1, QTableWidgetItem("(1,1)"))
def fun_cellClicked(self,row,col):
print("cell clicked row : %d , col : %d" %(row,col))
if __name__ == "__main__":
app = QApplication(sys.argv)
mywindow = MyWindow()
mywindow.show()
app.exec_()
QTableWidget class에서 cellcliked 시그널을 connect를 이용해서 fun_cellCliked 라는 임의의 펑션에 연결했다.
이렇게 해두면, 이제 해당 테이블에서 어떤 셀을 유저가 클릭하면 fun_cellCliked 라는 메소드가 실행되는 것이다.
한편 fun_cellCliked 메소드에는 row, col 이라는 2개의 input data가 들어오도록 정의해놨는데
이것은 cellcliked 시그널이 저 2개의 데이터를 전달해주기 때문에 그렇게 한 것이다.
만약 굳이 행,열 정보가 필요없다면
fun_cellCliked(self) 이렇게만 정의해두고 써도 상관은 없다.
사용자 정의 시그널
위 위키독스 사이트 공부해서 내용 정리하자.