Qt의 일반 함수 인 것처럼 emit 사용과 신호 호출 void progressNotification(int progress); Qt의 emit 키워드에

이 신호가 있다고 가정 해 봅시다.

signals:
    void progressNotification(int progress);

Qt의 emit 키워드에 대해 최근에야 배웠습니다. 지금까지는 일반 함수처럼 신호를 호출하여 신호를 실행했습니다. 그래서 대신 :

emit progressNotification(1000 * seconds);

나는 다음과 같이 쓸 것이다.

progressNotification(1000 * seconds);

그렇게 호출하면 작동하는 것 같고 연결된 모든 슬롯이 실행되므로 emit 키워드를 사용하면 다른 동작이 발생합니까? 아니면 구문 설탕입니까?



답변

emit통사론 적 설탕입니다. 신호를 방출하는 함수의 전처리 된 출력을 보면 emit그냥 사라진 것을 볼 수 있습니다 .

“마법”은 신호 방출 함수에 대해 생성 된 코드에서 발생하며 moc에 의해 생성 된 C ++ 코드를 검사하여 확인할 수 있습니다.

예를 들어 foo매개 변수가없는 신호는 다음 멤버 함수를 생성합니다.

void W::foo()
{
    QMetaObject::activate(this, &staticMetaObject, 0, 0);
}

그리고 코드 emit foo();는 단순히foo();

emitQt/qobjectdefs.h(어쨌든 소스의 오픈 소스 풍미에서) 다음과 같이 정의됩니다 .

#ifndef QT_NO_EMIT
# define emit
#endif

(define guard는 no_keywordsQMake 구성 옵션을 통해 충돌하는 이름을 가진 다른 프레임 워크와 함께 Qt를 사용할 수 있도록하는 것 입니다.)


답변

18 개월 후 … @Mat의 답변으로 댓글을 달기 시작했고 곧 방이 부족해졌습니다. 따라서 대답.

IMO emit는 통사론 적 설탕도 아니고 단순한 키워드도 아닙니다.

  1. 위의 @Mat에서 설명한대로 코드를 생성합니다.
  2. 그것은 도움이 connect메커니즘은 그것이입니다 실제로 것을 인식 signal하고,
  3. 신호와 응답 (슬롯)이 동기식 또는 비동기식으로 실행되거나 신호가 방출되는 위치와 방법에 따라 대기 할 수있는 “더 큰”시스템의 일부가됩니다. 이것은 신호 / 슬롯 시스템의 매우 유용한 기능입니다.

전체 신호 / 슬롯 시스템은 단순한 함수 호출과는 다른 관용구입니다. 관찰자 패턴에서 비롯된 것이라고 생각합니다. a signal와 a 사이에도 큰 차이가 있습니다 slot. 신호 구현할 필요가 없지만 슬롯 !

당신은 길을 걷고 있는데 집에 불이 붙는 것을 본다 (신호). 911에 전화를 겁니다 ( 화재 신호를 911 응답 슬롯에 연결 ). 신호는 방출 된 반면 슬롯 소방서 에서 구현 되었습니다. 정확하지 않을 수 있지만 아이디어를 얻습니다. OP의 예를 살펴 보겠습니다.

일부 백엔드 객체는 얼마나 많은 진행이 이루어 졌는지 알고 있습니다. 그래서 그것은 단순히 emit progressNotification(...)신호를 보낼 수 있습니다. 이 신호를 선택하고 실행하는 것은 실제 진행률 표시 줄을 표시하는 클래스에 달려 있습니다. 그러나 뷰는이 신호에 어떻게 연결됩니까? Qt의 신호 / 슬롯 시스템에 오신 것을 환영합니다. 이제 뷰 객체와 데이터 계산 객체 (둘 다 QObjects) 로 구성된 관리자 클래스 (일반적으로 일종의 위젯 )를 생각할 수 connect (m_myDataEngine, &DataEngine::progressNotification, m_myViewObj, &SimpleView::displayProgress)있습니다.

관리자 클래스의 디자인 측면에 대해 살펴 보지 않겠습니다. 그러나 이것이 신호 / 슬롯 시스템이 빛나는 곳이라고 말하면 충분합니다. 내 애플리케이션을위한 매우 깨끗한 아키텍처를 설계하는 데 집중할 수 있습니다. 항상 그런 것은 아니지만 종종 나는 단지 신호를 내고 슬롯을 구현 한다는 것을 알게 됩니다.

시그널 메서드 를 방출하지 않고 사용 / 호출 할 수 있다면 , 그것은 반드시 그 함수 가 처음에 시그널로 필요하지 않았 의미합니다 .


답변

두 번째 옵션은 함수 이름과 함수 매개 변수가 무엇인지 항상 알고 있으며이를 보내는 객체가 특정 함수에 의해 알려져 있음을 의미합니다. 이 두 가지 경우는 항상 사실이 아니므로 슬롯과 신호가 만들어진 두 가지 주요 이유입니다. “후드”신호 및 슬롯 메커니즘은 연결된 모든 기능에 대한 포인터가있는 테이블 일뿐입니다.

또한 신호 및 슬롯 메커니즘의 특성을 매우 명확하게 설명하는이 pdf를 참조하십시오 .
http://www.elpauer.org/stuff/a_deeper_look_at_signals_and_slots.pdf