2016-08-05 7 views
3

두 개의 서로 다른 두 개의 신호가 있습니다. classesABclass C입니다. void SomeSignal()은 어떤 인수도없이 class A의 신호입니다. 나는 또 다른 클래스의 다른 신호 void SomeSignal(int)을 가지고 있습니다.QT에서 이름이 같지만 인수가 다른 두 개의 슬롯을 사용할 수 있습니까?

이 신호는 class C에서 두 가지 다른 방식으로 처리해야합니다. 두 개의 슬롯을 void SomeSignal()void SomeSignal(int)class C에 만들 수 있습니까?

답변

6

예 유효합니다. 그러나 이렇게하면 Qt 5 연결 구문을 사용할 때와 다른 방식으로 신호/슬롯에 연결해야합니다.

connect(a, &A::SomeSignal, this, static_cast<void (C::*)(void)>(&C::SomeSlot)); 
connect(b, &B::SomeSignal, this, static_cast<void (C::*)(int)>(&C::SomeSlot)); 

을 또는 당신은 Qt는 5.7을 사용하는 경우 qOverload 도우미 기능을 사용 : 짧은 그래서 connecting to overloaded signals and slots

을 처리하는 방법에

다음과 같은 질문을보고 답변은,로 연결합니다.

편집 : @TobySpeight로 명시 적으로 템플릿 인수를 사용하여 아래에 지적 : 하나의 슬롯에 과부하가되기 때문에 연결을 모두 템플릿 인수를 지정해야합니다 같은

QObject::connect<void(A::*)(), void(C::*)()>(&a, &A::SomeSignal, &c, &C::SomeSlot); 
QObject::connect<void(B::*)(int), void(C::*)(int)>(&b, &B::SomeSignal, &c, &C::SomeSlot); 
  • 이 보인다.
+1

멤버 포인터를'static_cast'보다'connect <>()'] (/ a/37302949)에 명시 적 템플릿 인자를 제공하는 것이 더 안전하다고 생각합니다. –

+0

@TobySpeight이 구문을 알지 못했습니다. 감사합니다. QObject :: connect의 구현을 볼 때 이것이 어떻게 추론 될 수 있는지 알 수 있지만, 특히 [QObject :: connect()] (http : // doc.)의 문서를 볼 때 문서화되지 않은 것처럼 보입니다. qt.io/qt-5/qobject.html#connect-3) (문서는 템플릿 사용을 숨 깁니다) –

1

네가 할 수 있겠지만, 완전히 다른 클래스에서 오는 다른 것들을 다룰 경우, 그 슬롯을 다르게 명명하는 것이 더 명확하다. (신호 이름과 링크 된 슬롯 이름 사이에는 아무런 관계도 없다는 것을 기억하자).

+0

감사합니다. @Matteo Italia. – skyaakash

+1

단순히 과부하 일뿐입니다. –