信號和槽是qt用於對象之間通信的核心機制。其目的類似於當一個動作發生的時候,需要對這個動作做出相應的處理,很多時候首選回調函數,通過回調函數完成對此動作的操作。但是有一個小小的問題,如果對一個龐雜的系統,這種回調函數的維護是相當的麻煩和危險的,所以qt爲了很好的避免實現了自己的一套通信機制,即信號和槽。
1、信號:是可以看作是一個請求或者一個動作的標誌。如果一個對象在達到一個狀態或者需要一個請求等操作的時候,其會觸發這個信號。qt實現觸發請求,使用emit命令。此是qt固有的。
觸發的參數是對象聲明的信號,即signals下聲明的函數類型,其沒有實現。因爲其目的只是作爲一個標誌,然後將對應的函數形式及參數傳遞出去。
注意:signals:是qt自由的關鍵字,其不需要具體的實現。
2、槽:其實就是一個處理函數,是在對象中聲明爲slots:之下的函數及其實現,其類似於回調函數一樣。槽是一個對象對他感興趣的對象的某個時間做出處理。
需要注意的是,槽函數也可以當作一個普通的函數進行調用。同時槽函數函數的聲明應該和其需要對接的信號一致。
其信號槽工作的過程是:當一個對象通過emit發射一個信號的時候,則和其連接的對象的槽函數進行處理,等槽函數處理完成之後emit退出並執行接下來的內容。
那麼信號和槽是怎麼連接呢?則是通過qt最根本的元對象QObject的connect進行連接。
其有兩個函數,分別完成對象的連接和斷開,且都是靜態函數,即:
bool QObject::connect ( const QObject * sender, const char * signal, const char * method, Qt::ConnectionTypetype = Qt::AutoConnection ) const
將sender對象的信號連接到此對象的槽函數中
bool QObject::connect ( const QObject * sender, const char * signal, const QObject * receiver, const char * method, Qt::ConnectionTypetype = Qt::AutoConnection ) [static]
將sender對象的信號連接到receiver的槽函數中
bool QObject::disconnect ( const QObject * sender, const char * signal, const QObject * receiver, const char * method )
斷開sender的信號與receiver的槽
bool QObject::disconnect ( const char * signal = 0, const QObject * receiver = 0, const char * method = 0 ) 斷開信號與reciver對象的槽的連接。如果一個對象銷燬也會斷開
bool QObject::disconnect ( const QObject * receiver, const char * method = 0 )
斷開所有與receiver的槽連接的信號,對象被刪除時自動執行斷開
註釋:sender是發出信號的對象,其類型選QObject,可以使用所有的控件,因爲其實所有Qt控件的基類
signal是以一個信號函數,經過SIGNAL宏處理爲對應的字符
receiver是接收信號的對象
method是接收對象對應的處理槽函數,通過SLOT處理爲字符串
下面看一個簡單的例子:
#include<QApplcation>
#include <QPushButton>
int main(int argc,char *argv[])
{
QApplication app(argc,argv);
QPushButton btn;
btn.setText("Quit");
QObject::connect(&btn,SIGNAL(clicked()),&app,SLOT(quit()));//連接信號槽,這樣當點擊btn時出發clicked信號被app對象接收並用quit槽處理
//QObject::disconnect(&btn,SIGNAL(clicked()),&app,SLOT(quit()));如果斷開,則app不會執行quit的槽的
btn.show();
return app.exec();
}
Button主要看作觸發一個動作,其被點擊的時候會發送一個click的功能,此時會被app對象接收,並相應其quit槽進行處理。此程序的目的是發射一個退出指令,qt程序退出。
QPushButton是qt的一個Button,至於詳細內容可查看後期詳細講解。
關於qt信號槽的實現原理在後續文章會進行專題研究。
爲了便於理解值得一提的是,qt的信號槽需要moc工具協助完成,其會對signals下的信號及slots下的槽函數進行一個等級管理,在連接的時候通過SIGNAL及SLOT槽完成對應的信號槽的對接,以實現準確調用。
本文出自 “zhouhb” 博客,請務必保留此出處http://hongbin0720.blog.51cto.com/3305400/1230096