본문 바로가기
프로그래밍/라이브러리

[PyQt] 시그널 블럭

by 써드아이 2020. 5. 4.

ListWidget을 상속받은 클래스에 checkbox를 포함한 item을 넣었는데
checkbox의 체크 여부에 따라 item 텍스트의 색깔을 변경 시키고 싶었다


setStyleSheet를 쓰고 싶었으나 ListWidgetItem이 이 메소드를 지원하지 않았다.

listwidget의 stylesheet를 활용하는 방법을 찾을 수 있었는데 잘 동작하지 않았다. checkbox 가 변경된 하나의 item의 색상만 변경하고 싶었지만 아무 checkbox나 변경될 때 마다 모든 item의 색상이 변경 되었다.


item에 변화가 있을 경우 발생하는 itemChanged 시그널을 처리하는 슬롯을 만들어 그 안에서 setForeground() 메소드로 텍스트의 색깔을 바꾸었다.

동작은 잘 했지만 사소한 문제가 있었다.
이상하게 itemChanged 시그널을 두번 처리하는 것이다.
아마도 setForeground() 메소드 때문인듯 한데
희안하게 딱 두번만 발생한다. (무한 루프에 빠져야 정상 아닌가?)

어쨌건 해결하고 싶었다.


ListWidgetItem에서 checkbox가 변경되었을 때 발생되는 시그널이 무엇인지 알면 좋으련만 그거에 대한 내용은 qt 도큐먼트에도 없었다.

엇추 비슷한 내용을 찾다보니 시그널을 블럭 시킬수 있는 메소드가 있더라..

https://stackoverflow.com/questions/13771694/turn-off-pyqt-event-loop-while-editing-table


qobject로부터 상속받은 모든 클래스가 가지고 있다고 하니 listwidget에도 있으리라..


itemChanged 시그널을 처리하는 메소드에서 item을 변경하기 전에 blockSignals(True) 변경후에 blockSignals(False) 를 호출해주니 원하던 대로 동작한다!!!!!

안정성은 확인 못 했지만 원하던바대로 동작한다

'프로그래밍 > 라이브러리' 카테고리의 다른 글

[PyQt] QMainWindow에서 QMenu 꺼내기  (0) 2020.05.08
[PyQt] ui 추출  (0) 2020.05.06
[PyQt] addLayout() / setLayout() 쓰임  (0) 2020.04.16
[PyQt] datime형과 QDate 간의 변환  (0) 2020.04.15
[PyQt] 화면 크기 조정  (0) 2020.04.14