Qt로 신호를 차단하는 방법

2369 단어 Qtqt5

소개



"QSpinBox의 valueChanged 시그널과 임의의 슬롯을 접속해 처리하고 있었지만, 이 푸시 버튼으로 스핀 박스의 값을 변경했을 때는 시그널을 발행해 싶지 않다"라고 하는 느낌으로, 특정의 처리의 때만 시그널을 발행하고 싶지 않을 때, 어떻게 하면 시그널의 발행을 억제할 수 있는지 조사해 보았습니다.

QSignalBlocker를 사용하는 방법



QSignalBlocker 의 생성자에게 시그널의 발행을 억제하고 싶은 오브젝트를 건네주고 합니다.
const QSignalBlocker blocker(ui->spinBox);

QSignalBlocker 의 인스턴스를 작성하면(자), 이 인스턴스가 살아 있는 동안에는, 인수에 건네준 오브젝트의 시그널은 억제됩니다.

파기된 타이밍에서, 오브젝트의 시그널의 블록 상태는 QSignalBlocker 의 생성자 가 실행되기 전의 상태에 되돌려집니다.

QObject::blockSignals를 사용하는 방법



QObject::blockSignals(bool block) 를 사용한 방법은 다음과 같습니다.
const bool wasBlocked = ui->spinBox->blockSignals(true);
/* 何らかの処理 */
ui->spinBox->blockSignals(wasBlocked);

blockSignals 에 true 를 건네주면 그 객체의 시그널은 억제됩니다. 이 때, blockSignals 는 지금 현재의 시그널의 블록의 상태를 돌려주기 때문에 취해 두고, 용이 끝나면 이것을 사용해 원래대로 되돌려 올립니다.

샘플



스핀 박스의 업다운 버튼으로 값을 바꾸었을 때는 시그널을 발행해, 자전으로 준비한 푸시 버튼(+,-)으로 변경했을 때는 시그널을 발행하지 않는 샘플을 GitHub에 올려 둡니다.

GitHub - SignalBlockTest


참고



Qt Documentation - QSignalBlocker Class
Qt Documentation - QObject Class (blockSignal)

좋은 웹페이지 즐겨찾기