QObject::connect()函數使用的幾個注意點

一:connect()函數有且只能在QObject類裏面和QObject派生類裏面使用

connect()函數有且只能在QObject類裏面和QObject派生類裏面使用,自己新建的類裏面(基類不是QObject類和其QObject派生類)使用connect()函數是無效的,編譯時一直報錯。當然,我們新建工程比如widget,mainwindow,dialog都是QObject的派生類,所以可以直接使用connect()函數,實現信號與槽機制。

類ClassMQTT不是QObject類也不是其派生類時,使用connect()信號與槽機制時,編譯會報錯,如下圖所示:

二:宏定義不能用在signal和slot的參數中。

既然moc工具不擴展#define,因此,在signals和slots中攜帶參數的宏就不能正確地工作,如果不帶參數是能的。例如,下面的例子中將帶有參數的宏SIGNEDNESS(a)作爲信號的參數是不合語法的:

#ifdef ultrix 
#define SIGNEDNESS(a) unsigned a 
#else 
#define SIGNEDNESS(a) a 
#endif 

class Whatever : public QObject 
{ 
    //[…] 
    signals: 
    void someSignal( SIGNEDNESS(a) ); 
    //[…] 
}; 

三:構造函數不能用在signals或slots聲明區域內。 

的確,將一個構造函數放在signals或slots區內有點不可理解,無論怎麼,不能將他們放在private slots、protected slots或public slots區內。下面的用法是不合語法需求的:

class SomeClass : public QObject 
{ 
    Q_OBJECT 
public slots: 
    SomeClass( QObject *parent, const char *name ) 
        : QObject( parent, name ) {} // 在槽聲明區內聲明構造函數不合語法 
    //[…] 
}; 

四: 函數指針不能作爲信號或槽的參數。 

例如,下面的例子中將void (*applyFunction)(QList*, void*)作爲參數是不合語法的: 

class someClass : public QObject 
{ 
    Q_OBJECT 
    //[…] 
public slots: 
    void apply(void (*applyFunction)(QList*, void*), char*); // 不合語法 
}; 

你能採用下面的方法繞過這個限制:

typedef void (*ApplyFunctionType)(QList*, void*); 
class someClass : public QObject 
{ 
    Q_OBJECT 
    //[…] 
public slots: 
    void apply( ApplyFunctionType, char *); 
}; 

五:信號和槽不能有缺省參數。 

既然signal->slot綁定是發生在運行時刻,那麼,從概念上講使用缺省參數是困難的。下面的用法是不合理的: 

class SomeClass : public QObject 
{ 
    Q_OBJECT 
public slots: 
    void someSlot(int x=100); // 將x的缺省值定義成100,在槽函數聲明中使用是錯誤的 
}; 

六:信號和槽也不能攜帶模板類參數。 

如果將信號、槽聲明爲模板類參數的話,即使moc工具不報告錯誤,也不可能得到預期的結果。例如,下面的例子中當信號發射時,槽函數不會被正確調用: 

public slots: 
    void MyWidget::setLocation (pair location); 
public signals: 
    void MyObject::moved (pair location); 

不過,你能使用typedef語句來繞過這個限制。如下所示:

typedef pair IntPair; 
public slots: 
    void MyWidget::setLocation (IntPair location); 
public signals: 
    void MyObject::moved (IntPair location); 

這樣使用的話,你就能得到正確的結果。 

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章