信號和槽

一、信號和槽 


Qt的一項重要的機制就是它的信號和槽,在圖形用戶界面編程中,經常需要將一個窗口部件的變化通知給另一個窗口部件,或者說系統對象進行通信.一般的圖形用戶編程中採用回調函數進行對象間通信(如:gtk+),這樣回調函數和處理函數捆綁在一起,但這樣做沒有信號和槽機制簡便和靈活.

如Qt的窗口部件有多個預定義的信號,槽是一個可以被調用處理特定信號的函數.Qt的窗口部件有多個預定義的槽,當一個特定的時候發生的時候,一個信號被髮射,對信號感興趣的槽就會調用對應響應函數.

信號/槽機制在QObject類中實現,從QObject類或其一個子類繼承的所有類可以包含信號和槽.當對象改變其狀態的時候,信號被髮送,對象不關心有沒有其他對象接收到這信號.槽是類的正常成員函數,可以將信號和槽通過connect函數任意相連.當一個信號被髮射,它所連接的槽會被立即執行,如同一個普通函數調用一樣.

槽是普通成員函數,它和普通成員函數一樣分爲public、protected和private共3類。Public slots表示聲明是任何信號都可以相連的槽;protected slots表示這個類的槽及其子類的信號才能連接;private slots表示這個類本聲的信號可以連接這個類的槽。

 

二、 在Qt Designer中信號應用實例

下面我們用一個實例來了解信號的用法.

首先我們新建一個文件夾:

#mkdir /root/Desktop/qt/signal

我們打開Qt創建項目,項目路徑爲 /root/Desktop/qt/signal/signal.pro

從菜單欄的 File->New 打開新建對話框,選擇第二個:Dialog,然後也同樣保存到剛剛創建的文件夾下。

這時侯,你的 QT Designer 中就會出現一個 From1 來. 更改右下角那個窗口裏的name 改爲MainFrom.把caption的值改爲signal".

然後我們從左面的Toolbox拖拽一個PushButton.並把name改爲ExitButton,把text改爲Exit.

下面是效果圖:

 

 

到這裏我們已經把頁面設置完了,下面我們爲ExitButton設置信號函數.

    我們按一下 F3(或者有菜單欄選擇 Edit->Connections ),然後在那個 “Exit” 按鈕上點擊一下。

這時侯我們就看到了View and Edit Connection 頁面了. 在Signal中選擇clicked,在slot中,先選擇close()就好了,在 Reciever中選擇MainFrom.這時侯選擇OK.

 

我們就算是基本完成了。保存下。 如果想看看這個小程序長什麼樣子.可以用 CTRL+T來看 PreView.

我們現在還不能編譯這個程序,爲什麼呢?對了因爲我們還缺少一個main.cpp。想一想上一章怎樣創建的了。從菜單欄的File->New打開新建對話框,選擇最後一個:C++ Main—File(main.cpp).

好了,現在來編譯我們的程序。

先打開一個終端,然後切換到我們建立工程的目錄。然後利用Qt的工具生成Makefile文件。# qmake

編譯:# make

運行:# ./signal

點擊Exit按扭,程序退出。

 

三、在Qt Designer中槽應用實例

下面我們要做一個加法器。打開Qt,新建名爲slot的工程文件,然後再新建如下圖所示的界面:

 

修改要顯示結果的label的name爲textLableresult.並把其text清空.把確定按扭的name改爲AddButton.

好了,我們已經把頁面設置好了.我們現在要做的就只有使用戶按AddButton按扭時textLableresult能夠顯示lineEdit1和lineEdit2的和.所以我們必須對AddButton的clock信號設置一個槽.

首先按一下 F3(或者有菜單欄選擇 Edit->Connections ),然後在AddButton按鈕上點擊一下這時侯我們就看到了"View and Edit Connection"的頁面了。在Signal中選擇clicked, 在Receiver中選擇MainForm.在Slot中,都是QT爲我們準備好的槽,我們需要建立自己的槽.

點擊右邊的“Edit Slots...”按鈕,然後就可以看見" Edit Functions "窗口,該窗口也可以通過“主菜單 Edit->Slots” 打開。點擊 "New Function" 按鈕,將"newSlot()"改爲 "add()" ,然後選擇 OK。

這時我們已經建立了一個槽,我們再回到 "View and Edit Connection"對話框中,在 Slot 中我們現在看到了剛剛自己創建的槽"add()",我們選擇它.這樣就可以使AddButton的信號與add()槽關聯起來了。

 

我們還需要向add()槽裏寫一些代碼,使它能夠完成加法功能.在主窗體"form_main"的空白處雙擊鼠標左鍵,彈出對話框"Creating ui.h file",我們選擇"Yes",然後可以看到一個編輯窗口。如下圖所示:

 

我們需要在 void MainForm::add()中添加如下的代碼:

void MainForm::add()

{

    QString str1,str2,strResult;

    double add1=0.0,add2=0.0,result0.0;

 

    str1=lineEdit1->text();

    str2=lineEdit2->text();

 

    Bool ok1=FALSE,ok=FALSE;

    add1=str1.toDouble(&ok1);

    add2=str2.toDouble(&ok2);

 

    if(ok1&&ok2)

    {

        result=add1+add2;

        strResult.sprintf("%f",result);

        textLabelResult->setText(strResult);

    }

}
 

到這裏我們編輯的工作就都結束了,我們先保存。然後打開一個終端,改變當前目錄爲我們保存項目的目錄,然後

生成Makefile文件:#qmake

編譯:# make

運行:# ./ slot

下面是我運行的界面:

 

 

四、在終端窗口中Qt編程信號的應用實例
打開一個終端,用vi建立一個文件t2.c,鍵入如下程序:
#include <qapplication.h>
#include <qpushbutton.h>
int main( int argc, char **argv )
{
QApplication a( argc, argv ); //創建QApplication對象

QPushButton quit( "Quit", 0 ); //添加一個按扭,因爲這個按鈕是一個頂層窗口,我們把0作爲它的父對象
quit.resize( 75, 30 ); //設置按扭尺寸
QObject::connect( &quit, SIGNAL(clicked()), &a, SLOT(quit()) );// quit按扭的clicked信號與QApplication對象的quit()槽連接
a.setMainWidget( &quit ); //設置a爲這個應用程序的主窗口部件
quit.show(); //顯示quti按扭
return a.exec();
}

生成工程文件:

qmake -project
生成makefile
qmake

編譯mnake


下面是界面截圖:


用戶點擊按扭,程序退出.

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