가끔, 위젯의 상태를 변경하지만, 변경시 발생하는 시그널은 블럭해야 하는 경우가 있다.
(변경 시그널은 발생시키지 않아야 하는 경우 = 변경 시그널에 connect 되어 있는 함수를 실행하면 안되는 경우)
이럴 경우, SignalBlocker를 사용하면 된다.
방법 1. blockSignals 함수 사용
blockSignals(True) 와 blockSignals(False) 사이에서 실행되는 코드는 signal을 발생시키지 않는다.
아래는 checkBox에서, 시그널을 블럭하면서 체크 상태를 바꾸는 예이다.
# Python code
self.checkBox.blockSignals(True)
self.checkBox.toggle()
self.checkBox.blockSignals(False)
방법 2. QSignalBlocker 사용
위와 동일한 기능을 하는 QSignalBlocker라는 클래스를 사용할 수도 있다.
중괄호 안에서 QSignalBlocker를 생성하면, 해당 범위 안에서 시그널을 막아준다.
- 시그널 블럭 대상 : QSignalBlocker 인자로 넘어온 오브젝트 (예: 체크박스)
- 시그널 블럭 범위 : QSignalBlocker 생성 후, 중괄호가 끝날때까지 (QSignalBlocker 가 생성된 후, 소멸되기 전까지 시그널을 막음)
// C++ code
#include <QSignalBlocker>
ui->checkBox->setChecked(true); // 시그널 발생함
if (wantToBlockSignal)
{
const QSignalBlocker blocker(ui->checkBox); // if문 범위 내에서, ui->checkBox의 시그널을 block한다
ui->checkBox->setChecked(false); // 시그널 발생 안함
}
ui->checkBox->setChecked(true); // 시그널 발생함
참고 : https://doc.qt.io/qt-5/qobject.html#blockSignals
'개발 > Qt' 카테고리의 다른 글
[Qt] QPushButton의 background color 설정하기/가져오기 (0) | 2022.02.21 |
---|---|
[Qt] QMessageBox 안에 html 태그 입력하기 (0) | 2022.02.18 |
[Qt] Qt 프레임워크란 (0) | 2022.01.25 |
[Qt] QString을 Char*로 변경하는 방법 (0) | 2022.01.15 |
[Qt] QTreeWidget 예제 코드 (데이터 보기/추가/수정/삭제/이동) (0) | 2022.01.08 |