2011-01-31 2 views
1

내가 추상 기본 클래스 Foo 있다고 가정하고, 나는 신호가에 대한 참조를 사용하려면 :Qt 신호에서 추상 클래스에 대한 참조를 사용하는 방법은 무엇입니까?

void FooUpdated(Foo &); 

이 작동하지 않는, 일치하는 슬롯은 호출되지 않습니다. 이를 달성하는 방법이 있습니까, 아니면 대신 포인터를 사용해야합니까 (포인터와 함께 작동합니다).

편집 - 코드

신호 (IDecodedFrame 추상적 인) :

void ShowFrameSignal(IDecodedFrame & DecodedFrame); 

슬롯 :

virtual void ShowFrame(IDecodedFrame & DecodedFrame); 

연결 :

connect(this, SIGNAL(ShowFrameSignal(libCommon::IDecodedFrame &)), 
     sink, SLOT(ShowFrame(libCommon::IDecodedFrame &))); 

디버깅은 연결이 true을 반환 함을 나타냅니다.

+0

어떻게 슬롯의 모습 등을들 수 있으며, 당신은 어떻게 신호와 슬롯을 연결합니까? –

+0

@ 프랭크 : 연결에 대한 정의와 코드를 추가했습니다. –

+0

설명서를 보지 않고도 답을 모르겠지만 IDecodedFrame이 다른 기본 Qt 클래스에서 파생되고 필요한 기능을 구현해야한다고 확신합니다. 아마 안전한 복사를하기위한 복사 생성자 일 겁니다. –

답변

0

SIGNALSLOT 매크로에는 참조 기호 (&)가 필요하지 않습니다.

#include <QtCore> 
#include <QtDebug> 

class ISignalable { 
public: 
    virtual void Go() const = 0; 
}; 

class Signalable : public ISignalable { 
public: 
    void Go() const { qDebug() << "Go!"; } 
}; 

class Caller : public QObject { 
    Q_OBJECT 
public: 
    void CallSignal(const ISignalable &obj) const { RunSignal(obj); } 
signals: 
    void RunSignal(const ISignalable &obj) const; 
}; 

class Sink : public QObject { 
    Q_OBJECT 
public slots: 
    void HandleSignal(const ISignalable &obj) const { 
    obj.Go(); 
    } 
}; 

int main (int argc, char ** argv) 
{ 
    QCoreApplication app(argc, argv); 
    Caller c; 
    Sink s; 
    QObject::connect(&c, SIGNAL(RunSignal(ISignalable)), 
        &s, SLOT(HandleSignal(ISignalable))); 
    Signalable obj; 
    c.CallSignal(obj); 
    return app.exec(); 
} 

#include "main.moc" 

를 이것은 또한 작동합니다 :

QObject::connect(&c, SIGNAL(RunSignal(const ISignalable&)), 
       &s, SLOT(HandleSignal(const ISignalable&))); 
을 그 그것을 걸려 넘어 지거나 아니지만, 추상 클래스에 대한 참조를 사용하여 다음과 같은 예를 들어 나를 위해 노력하고있는 것이다 있는지 확실하지 않습니다

그러나이 작동하지 않습니다

QObject::connect(&c, SIGNAL(RunSignal(ISignalable&)), 
       &s, SLOT(HandleSignal(ISignalable&))); 
+1

"SIGNAL 및 SLOT 매크로는 참조 기호 (&)가 필요하지 않습니다. - 비 const 참조에서 사용됩니다. _const_ ref 만 및 사본은 신호/슬롯과 동일합니다. –

0

송신자와 수신자가 그 연결이 대기중인 다른 스레드에서 그들이 복사 할 수 없습니다 당신이 참조를 사용할 수 없습니다 연결이 유형의 경우. connect() 전화를 걸었을 때 연결 유형을 지정하지 않았으므로 연결 유형이 Qt::AutoConnection으로 설정되어 있고 connect()이 호출 될 때 wheather 신호 전달 (읽기 호출 슬롯)이 성공할 것인지 알 수 없습니다. 그런데

이 나를 위해 작동합니다

#include <QtCore/QCoreApplication> 
#include <QDebug> 


class Abstract : public QObject { 
    Q_OBJECT 
public: 
    virtual ~Abstract() {}; 
    virtual void abstract() = 0; 
}; 


class Test : public QObject { 
    Q_OBJECT 
public: 
    Test() { 
     connect(this, SIGNAL(aSignal(Abstract &)), 
       this, SLOT(aSlot(Abstract &))); 
    }; 
    void test() { 
     emit aSignal(*static_cast<Abstract*>(0)); 
    } 

signals: 
    void aSignal(Abstract & abstract); 

public slots: 
    virtual void aSlot(Abstract & abstract) { 
     qDebug() << "slot was called"; 
    }; 
}; 


int main(int argc, char *argv[]) 
{ 
    QCoreApplication app(argc, argv); 

    Test aTest; 
    aTest.test(); 

    return app.exec(); 
} 

#include "main.moc" 
관련 문제