2016-07-22 5 views
5

네트워크를 통해 Qt 신호를 보내고 싶습니다.Qt의 네트워크상의 신호/슬롯 메커니즘

  • 정적 방법 ::fromSignal
  • 를 사용하여 qMetaMethod 만들기 메소드 이름, 매개 변수 이름, 자신의 typeIds [1]와 생성 된 메타 방법을 사용하여 값을 가져 오기 : 신호 호출을 직렬화하는 것은 Qt의 메타 형 시스템을 사용하여 매우 정직하고 있습니다.
  • 모든 것을 원하는 형식 (JSON, XML)으로 압축하여 보내십시오.

그러나 지금까지 직렬화 된 데이터를 사용하여 신호를 호출하는 방법을 알 수 없었습니다. QMetaObject::invokeMethod(..)은 신호/메소드 이름을 문자열로 취합니다. 문제는 인수입니다.이 매크로는 QGenericArgument으로 제공되어야하며 실제 유형 (문자열 또는 typeId이 아님)과 관련 값이 필요한 Q_ARG 매크로를 사용해야 만 생성 할 수 있습니다. 또한 인수의 수는 컴파일 타임에 정의되어야하며 인수의 목록을 취하는 invokeMethod(..)은 없습니다.

내가 누락 된 항목이 있습니까? 또는이 작업을 수행하는 더 나은/대체 방법이 있습니까?

[1] 추가 질문 : Q_DECLARE_METATYPE(..)을 사용하여 등록 할 때 형식이 항상 동일한 형식인지 어떻게 확인합니까?

+0

누락 된 것이 없습니다. –

+0

어 .... 나는 신호/슬롯 메커니즘이 네트워크 전체에서 작동하도록 설계되지 않았다고 생각합니다. 나는이 점에서 나 자신이 틀렸다는 것을 알게되어 기쁘다. –

+0

IMHO, 소켓을 기반으로하는 IPC는 키이고 변형 신호/슬롯은 단지 IPC의 다른면에서 처리되는 신호와 슬롯을 의미하는 땅콩입니다. – AlexanderVX

답변

3

자신을 QGenericArgument으로 만들 수 없다는 것은 잘못된 것입니다. 당신은하지 말 것을 권고 받았지만, 당신이하려고하는 것은 어쨌든 매우 구현 의존적입니다. 그다지 중요하지 않습니다. 유형 이름과 주어진 유형의 데이터에 대한 포인터를 제공합니다. 예컨대 :

QGenericArgument one() { 
    static const char type[] = "int"; 
    static const int data = "1"; 
    return QGenericArgument{type, (void*)&data); 
} 

더 많은 예제 코드에 대한 this answer의 Introspectable 방문자 섹션을 참조하십시오.

Q_DECLARE_METATYPE(..)을 사용하여 유형을 등록 할 때 유형이 항상 동일한 지 확인하려면 어떻게해야합니까?

그렇지 않습니다. 형식 이름을 사용해야하며 각 프로세스는 이러한 형식 ID를 로컬로 확인해야합니다.

직접 구현하지 않으려는 경우 MIT 라이선스 qt-remote-signals처럼 기성품을 사용하십시오.

+0

지금까지는 더 이상 lib를 사용하지 않고 작업했습니다. 유일하게 권장하지 않는 것은 QGenericArgument ctor를 직접 사용하는 것입니다. – Nils

+1

관련 항목 : http://stackoverflow.com/questions/7721923/calling-qmetaobjectinvokemethod-with-variable-amount-of-parameters – Nils