一、信號和槽
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
下面是界面截圖:
用戶點擊按扭,程序退出.