2017-02-08 4 views
0

Qt는 신호 슬롯 클래스 범위 형 외부 SDK에서 두 헤더 주어

class A 
{ 
    public: 
    class B 
    { 
    }; 
    public slots: 
    void onValue(B* b); 
}; 

class C 
{ 
    signal: 
    void value(A::B* b); 
}; 

문제는 I 신호와 C의 슬롯을 연결하는 방법이다 -> 데이터 유형 보낸 A는 런타임에서 양립 찍은 .

+0

B는 A의 범위에서 비공개이므로 외부에서 사용할 수 없습니다. 당신은 안전하지 않은 것을 할 수 있고 void 포인터를 사용하고 슬롯의 B 포인터에 던져 넣을 수 있습니다. 그러나 B가 비공식 인 것을보고, A 내부 이외의 다른 곳에서 방출 할 수있는 방법은 없습니다. – dtech

+0

@ddriver 미안하지만 오타였습니다. B는 공개입니다. –

+0

오류 메시지가 무엇입니까? 그 타입들은 실제로 호환이 가능합니다. – goug

답변

2

, 보고서 아래 코드는 signalslot 사이에 호환성 문제를보고 런타임 오류는 발견으로 :

QObject::connect(&c, SIGNAL(value(A::B*)), &a, SLOT(onValue(B*))); 

오류는 다음과 같습니다

QObject를 :: 연결 : 호환되지 않는 송신자/수신자 인수 C : : 값 (A :: B *) -> A :: onValue (B *)

이것은입니다. SIGNALSLOT은 매크로이며 런타임시 호출 호환성이 해결되어 A::BB이 동일 할 경우이 오류가 발생합니다 (대부분 단순 텍스트 비교이기 때문에 가능).

하지만 이전 스타일 연결 명령 (Qt5 이전)입니다. 새로운 스타일의 연결 명령을

:

에러가 컴파일 시간에보고되지
QObject::connect(&c, &C::value, &a, &A::onValue); 

않으며, 런타임시와 연결이 작동합니다.

+0

답변을 보내 주셔서 감사 드리며 Qt 새로운 스타일을 알려주십시오. –