가끔, 위젯의 상태를 변경하지만, 변경시 발생하는 시그널은 블럭해야 하는 경우가 있다.

(변경 시그널은 발생시키지 않아야 하는 경우 = 변경 시그널에 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

 

+ Recent posts