使用過qt的人都知道,signal/slot是Qt對象以及其派生類對象之間的一種高效通信接口,它是Qt的核心特性,也是區別與其他工具包的重要地方。它完全獨立於標準的C/C++語言,因此用正確的處理好信號和槽,必須藉助於一個成爲moc(Meta Object Compiler)的qt工具,該工具是一個C++預處理程序,能爲高層次的事件處理自動生成所需要的附加代碼。
1.與回調函數的不同:
回調函數傳遞的是函數指針,很容易造成程序崩潰,另一方面,回調方式緊緊的綁定了圖形用戶接口的功能元素,因此很難開發進行獨立的分類。而signal/slot機制也能攜帶任意數量和任意參數,並且不會像回調函數那樣產生core dumps。
此外,用戶可以將N多個信號和單個槽相連接,或者將將N個槽和單個信號連接,甚至是一個信號和另外一個信號連接。這樣,當信號發射時,所以與之相連的信號或者槽都會按一定的次序(沒有預定的順序,也就是說執行的先後順序是隨機的)執行,當所有與之相連的信號和槽返回後,emit纔會返回。
2.信號的定義:
siganls:
void mySignal();
void mySignal( int x );
void mySignal( int x, int y );
其中signals是Qt的關鍵字,而不是C/C++的關鍵字。此外信號與一般函數的區別是,它的所有返回值都是void,並且它沒有函數實現體,它的函數體是moc自動生成的。
3.槽的定義:
public slots:
void mySlot();
void mySlot( int x );
不同類型的slot有不同的操作權限,具體看slot是public、protected還是private。
4.信號與信號或者與槽的連接:
QObeject::connect( obj1, SIGNAL( mySignal() ), obj2, SLOT( mySlot() ) );
QObeject::connect( obj1, SIGNAL( mySignal() ), obj2, SIGNAL( mySignal2() ) );
5.信號與槽的斷開:
QObeject::disconnect( obj1, SIGNAL( mySignal() ), obj2, SLOT( mySlot() ) );
QObeject::disconnect( obj1, SIGNAL( mySignal() ), obj2, SIGNAL( mySignal2() ) );
這種機制GUI控件的操作來說很是方便,當然也要用的恰當,用的規範和科學。
本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/mawl2002/archive/2009/03/09/3973583.aspx