singal/slot實現機制

 使用過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

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