2010-08-30 56 views
2

我有一個信號和一個插槽應該很好地配合在一起。QT4沒有這樣的信號

class MemberVisitor: public QObject 
{ 
    Q_OBJECT 
signals: 
    void processMember(Member* member, bool &breakLoop); 
public: 
    void processList(QList<Member*>* list); 
}; 

連同:

class MemberFinder: public QObject 
{ 
    Q_OBJECT 
public slots: 
    void processMember(Member* member, bool &breakLoop); 
public: 
    Member* member(); 
    MemberFinder(QString memID): m_member(0), m_memID(memID) {}; 
private: 
    Member* m_member; 
    QString m_memID; 
}; 

不完全是複雜的,對不對?但我肯定錯過了一些東西,因爲QT總是給我錯誤:「Object :: connect:沒有這樣的信號MemberVisitor :: processMember()在OperationsOnMembers.cpp中:29」

下面是代碼,應該掛鉤它們:

QObject::connect(visitor, SIGNAL(processMember()), finder, SLOT(processMember())); 

我也試過所有合理的選擇,如調用finder函數。但是我仍然遇到同樣的問題。我錯過了什麼?

+0

你有沒有試圖改變breakLoop參數去一個指針,而不是通過由ref? – Gianni 2010-08-30 22:24:59

回答

8

connect()調用應該是:

QObject::connect(visitor, SIGNAL(processMember(Member*, bool&)), 
    finder, SLOT(processMember(Member*, bool&))); 

..provided該訪問者和取景器的指針。

4

您需要在QObject :: connect()調用中包含參數類型(但不包括參數名稱)。例如

QObject::connect(visitor, SIGNAL(processMember(Member*, bool&)), finder, SLOT(processMember(Member*, bool&))); 

這還允許過載信號和槽,所以可以發射具有相同的名稱,但不同的參數的信號(相同的功能,這基本上是一個時隙是什麼的過載)。

這也可以讓您將信號連接到參數較少的插槽。如果你的會員取景器有第二個插槽這樣的:

class MemberFinder: public QObject 
{ 
    Q_OBJECT 
public slots: 
    void processMember(Member* member, bool &breakLoop); 
    void processMember(Member* member); 
public: 
    Member* member(); 
    MemberFinder(QString memID): m_member(0), m_memID(memID) {}; 
private: 
    Member* m_member; 
    QString m_memID; 
}; 

您可以在相同的信號連接到第二個插槽例如:

QObject::connect(visitor, SIGNAL(processMember(Member*, bool&)), finder, SLOT(processMember(Member*))); 
相關問題