?? qtsignaland slot.txt
字號:
}
// 定義槽函數mySlot(int)
void TsignalApp::mySlot(int x)
{
QMessageBox::about(this,"Tsignal", "This is a signal/slot sample with one
parameter.");
}
// 定義槽函數mySlotParam(int,int)
void TsignalApp::mySlotParam(int x,int y)
{
char s[256];
sprintf(s,"x:%d y:%d",x,y);
QMessageBox::about(this,"Tsignal", s);
}
void TsignalApp::slotFileNew()
{
//發射信號mySignal()
emit mySignal();
//發射信號mySignal(int)
emit mySignal(5);
//發射信號mySignalParam(5,100)
emit mySignalParam(5,100);
}
應注意的問題
信號與槽機制是比較靈活的,但有些局限性我們必須了解,這樣在實際的使用過程中做到有的放矢,避免產生一些錯誤。下面就介紹一下這方面的情況。
1.信號與槽的效率是非常高的,但是同真正的回調函數比較起來,由于增加了靈活性,因此在速度上還是有所損失,當然這種損失相對來說是比較小的,通過在一臺 i586-133的機器上測試是10微秒(運行Linux),可見這種機制所提供的簡潔性、靈活性還是值得的。但如果我們要追求高效率的話,比如在實時系統中就要盡可能的少用這種機制。
2.信號與槽機制與普通函數的調用一樣,如果使用不當的話,在程序執行時也有可能產生死循環。因此,在定義槽函數時一定要注意避免間接形成無限循環,即在槽中再次發射所接收到的同樣信號。例如,在前面給出的例子中如果在mySlot()槽函數中加上語句emit mySignal()即可形成死循環。
3.如果一個信號與多個槽相聯系的話,那么,當這個信號被發射時,與之相關的槽被激活的順序將是隨機的。
4. 宏定義不能用在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) );
[...]
};
5. 構造函數不能用在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 ) {} // 在槽聲明區內聲明構造函數不合語法
[...]
};
6. 函數指針不能作為信號或槽的參數。
例如,下面的例子中將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 *);
};
7.信號與槽不能有缺省參數。
既然signal->slot綁定是發生在運行時刻,那么,從概念上講使用缺省參數是困難的。下面的用法是不合理的:
class SomeClass : public QObject
{
Q_OBJECT
public slots:
void someSlot(int x=100); // 將x的缺省值定義成100,在槽函數聲明中使用是錯誤的
};
8.信號與槽也不能攜帶模板類參數。
如果將信號、槽聲明為模板類參數的話,即使moc工具不報告錯誤,也不可能得到預期的結果。 例如,下面的例子中當信號發射時,槽函數不會被正確調用:
[...]
public slots:
void MyWidget::setLocation (pair<int,int> location);
[...]
public signals:
void MyObject::moved (pair<int,int> location);
但是,你可以使用typedef語句來繞過這個限制。如下所示:
typedef pair<int,int> IntPair;
[...]
public slots:
void MyWidget::setLocation (IntPair location);
[...]
public signals:
void MyObject::moved (IntPair location);
這樣使用的話,你就可以得到正確的結果。
9.嵌套的類不能位于信號或槽區域內,也不能有信號或者槽。
例如,下面的例子中,在class B中聲明槽b()是不合語法的,在信號區內聲明槽b()也是不合語法的。
class A
{
Q_OBJECT
public:
class B
{
public slots: // 在嵌套類中聲明槽不合語法
void b();
[....]
};
signals:
class B
{
// 在信號區內聲明嵌套類不合語法
void b();
[....]
}:
};
10.友元聲明不能位于信號或者槽聲明區內。
相反,它們應該在普通C++的private、protected或者public區內進行聲明。下面的例子是不合語法規范的:
class someClass : public QObject
{
Q_OBJECT
[...]
signals: //信號定義區
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -