Qt入門之信號槽概念--qt對象通信機制

標籤:qt信號槽
原創作品,允許轉載,轉載時請務必以超鏈接形式標明文章 原始出處 、作者信息和本聲明。否則將追究法律責任。http://hongbin0720.blog.51cto.com/3305400/1230096

   信號和槽是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

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