본문 바로가기
IT/파이썬

파이썬 여러 widget 이 하나의 슬롯(callback/signal) 함수 사용하기

버튼 클릭이든, cellchanged 든 위젯을 쓰다보면 이벤트에 반응하는 함수를 구현해서 써야 한다.

버튼이 여러개 인데 거의 동일한 기능을 한다든지 혹은 위젯 배열로 구성했다던지 할 때 각각 signal 함수를 만들면 편리한 점도 있지만, 코드 낭비가 심하다는 기분이 많이 든다.

 

그래서 찾아보니 sender() 라는 함수가 있어서 동일한 함수를 써도 누가 보내는지 구분할 수 있도록 되어 있다.

이젠 거의 대부분 같은 기능을 하는 중복 함수라면 같이 사용하면 되겠다.

 

아래 예제 코드의 일부분은 QLineEdit 위젯에 글자를 쓰면 원하는 글자만 받도록 만드는 filter 기능을 넣고 싶을 때 사용한 코드이다.

물론 QLineEdit 가 배열형태로 많이 있는 페이지에서 동일한 필터를 사용하는 경우 사용하는 시나리오에서 참고해 볼 수 있겠다.

 

# editingFinished signal 에 _filter 함수 등록
	self.lineEditList[i].editingFinished.connect( self._filterNumber )

# _filter 함수
	def _filterNumber(self):
	# 어떤 widget이 보냈는지 알아내서 editWidget 이름으로 사용하면 된다.
        editWidget = self.sender()

 

참고한 페이지는

doc.qt.io/archives/qtforpython-5.12/PySide2/QtWidgets/QLineEdit.html?highlight=qlineedit#PySide2.QtWidgets.PySide2.QtWidgets.QLineEdit.editingFinished

 

QLineEdit — Qt for Python

Qt Documentation QLineEdit Detailed Description A line edit allows the user to enter and edit a single line of plain text with a useful collection of editing functions, including undo and redo, cut and paste, and drag and drop (see setDragEnabled() ). By c

doc.qt.io

wikidocs.net/35792

textChanged() 시그널 이외에 많이 사용되는 시그널로 editingFinished()와 returnPressed()이다. 둘다 리턴/엔터키를 누를 때 발생되며, editionFinished()는 포커를 잃을 때에도 발생된다.

간단한 예시 코드지만, 어딘가 나중에 활용할 때가..

BJ.

음식은 공유하기 어려울 듯

ROMAN ODINTSOV 님의 사진, 출처: Pexels