2011-01-31 116 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

如何槽的樣子,以及如何連接信號和槽? – 2011-01-31 14:06:15

+0

@Frank:添加了連接的定義和代碼。 – 2011-01-31 14:14:24

回答

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&))); 
0

如果發送者和接收者是在不同的線程則連接進行排隊並與這種類型的連接,你不能使用引用,因爲他們不能被複制。由於您在connect()連接的類型設置爲Qt::AutoConnection時沒有提供連接類型,並且在調用connect()時它的未知時間信號的傳送(讀取調用插槽)將成功或不成功。

順便說一句,這個工作對我來說:

#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"