2016-10-15 1 views
0

우분투 14.04에서 Qt 4.8을 사용하고 있습니다.Qt :이 코드에 대한 신호 인수를 올바르게 정의하는 방법은 무엇입니까?

void MyServer::processMessage() 
{ 
    QByteArray data; 
    ... 

    ... 
    emit newMessage(data); 
} 

-
(헤더 파일)을 newMessage 신호를 정의 할 수있는 적절한 방법이 될 것입니다 무엇 :
현재, 나는 다음과 같은 코드 조각이

signals: 
    void newMessage(const QByteArray & newData); 

또는 :

signals: 
    void newMessage(QByteArray newData); 

상기 한 바와 같이, 신호는 함수이므로 QByteArray data은 신호를 방출 한 직후 더 이상 존재하지 않습니다 ...
신호를 정의하는 첫 번째 방법에 대한 걱정은 객체 (인스턴스)에 대한 참조를 인수로 전달한다는 것입니다 newMessage이 방출 된 후에 더 이상 존재하지 않습니다.

시간과 인내심에 미리 감사드립니다.
현재 : 내 응용 프로그램은 단일 스레드입니다.
추신 : 응용 프로그램이 멀티 스레드 일 경우 상황이 달라질 수 있습니까?

답변

2

, 가장 일반적인 버전이 될 것이다하지만

signals: 
    void newMessage(const QByteArray &newData); 

첫 번째 옵션에 대한 걱정 : 참조 전달은에서만 수행 할 수 있습니다. 10 (Qt::AutoConnection은 단일 스레드 신호/슬롯 연결에 대해 기본적으로 결과를 나타냅니다), 나머지는 신호 인수가 QVariant에 저장되고 참조는 그렇지 않다는 것을 요구하기 때문입니다.

이러한 Qt::DirectConnection을 사용하면 신호에 연결된 모든 슬롯이 실행될 때 방출 신호가 "돌아옵니다". 이 시점에서 아무도 data 개체가 더 이상 필요하지 않습니다.

1

앞의 대답 'how to pass qobject as argument from signal to slot in qt connect'에서 설명한 것처럼 Object를 포인터로 전달하는 것이 좋습니다.

signals: 
    void newMessage(QByteArray* newData); 

그리고 신호의 방출은 다음과 같습니다 :

그래서, 신호의 선언은 모두 괜찮 니

void MyServer::processMessage() 
{ 
    QByteArray data; 
    ... 

    ... 
    emit newMessage(&data); 
} 
+0

정확하게 기억하면 QObject를 복사 할 수 없으므로 값으로 전달할 수 없습니다 ... 이제 QObject에 대해 언급했습니다 :) –

+0

어쨌든 포인터 또는 참조 - 그다지 중요하지 않습니다. 값으로 데이터 객체를 전달할 필요는 없습니다.) 결국, 참조는 자동 간접 지정을 사용하는 상수 포인터로 볼 수 있습니다 (즉, 컴파일러가 * 연산자를 넣습니다). –

+1

그렇게하지 마십시오. OP가 걱정되는 문제가 발생합니다 (연결 유형이'Qt :: QueuedConnection' 인 경우). 'QObject'는 값에 의해 전달 될 수 없기 때문에 보통 포인터 값에 의해 전달됩니다 (복사가 불가능합니다). 'QByteArray'는'QObject'가 아니고 복사가 가능하며 포인터로 전달할 이유가 없습니다. – Mike

관련 문제