




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、Qt Creator快速入門快速入門第第2版版第第3 3章章 窗口部件窗口部件(1課時) 前一章中第一次建立前一章中第一次建立helloworldhelloworld程序時,曾看到程序時,曾看到Qt CreatorQt Creator提供的默認基類提供的默認基類只有只有QMainWindowQMainWindow、QWidgetQWidget和和QDialogQDialog三種。是的,這三種窗體也是以后用三種。是的,這三種窗體也是以后用的最多的,的最多的,QMainWindowQMainWindow是帶有菜單欄和工具欄的主窗口類,是帶有菜單欄和工具欄的主窗口類,QDialogQDialog是各
2、種是各種對話框的基類,而它們二者全部繼承自對話框的基類,而它們二者全部繼承自QWidgetQWidget。不僅如此,其實所有的窗。不僅如此,其實所有的窗口部件都繼承自口部件都繼承自QWidgetQWidget。主主 要要 內(nèi)內(nèi) 容容n3.1 基礎窗口部件基礎窗口部件QWidgetn3.2 對話框?qū)υ捒騋Dialogn3.3 其他窗口部件其他窗口部件n3.4 小結(jié)小結(jié)3.1 基礎窗口部件基礎窗口部件QWidget QWidgetQWidget類是所有用戶界面對象的基類,被稱為基礎窗口類是所有用戶界面對象的基類,被稱為基礎窗口部件。部件。QWidgetQWidget繼承自繼承自QObjectQOb
3、ject類和類和QPaintDeviceQPaintDevice類,其中類,其中QObjectQObject類是所有支持類是所有支持QtQt對象模型(對象模型(Qt Object ModelQt Object Model)的)的QtQt對象的的基類,對象的的基類,QPaintDeviceQPaintDevice類是所有可以繪制的對象類是所有可以繪制的對象的基類。本節(jié)內(nèi)容:的基類。本節(jié)內(nèi)容:n窗口、子部件以及窗口類型窗口、子部件以及窗口類型n窗口幾何布局窗口幾何布局 n程序調(diào)試程序調(diào)試 窗口、子部件以及窗口類型窗口、子部件以及窗口類型來看一個代碼片段:來看一個代碼片段: / 新建新建QWidge
4、t類對象,默認類對象,默認parent參數(shù)是參數(shù)是0,所以它是個窗口,所以它是個窗口 QWidget *widget = new QWidget(); / 設置窗口標題設置窗口標題 widget-setWindowTitle(QObject:tr(我是我是widget); / 新建新建QLabel對象,默認對象,默認parent參數(shù)是參數(shù)是0,所以它是個窗口,所以它是個窗口 QLabel *label = new QLabel(); label-setWindowTitle(QObject:tr(我是我是label); / 設置要顯示的信息設置要顯示的信息 label-setText(QObj
5、ect:tr(label:我是個窗口我是個窗口); / 改變部件大小,以便能顯示出完整的內(nèi)容改變部件大小,以便能顯示出完整的內(nèi)容 label-resize(180, 20); / label2指定了父窗口為指定了父窗口為widget,所以不是窗口,所以不是窗口 QLabel *label2 = new QLabel(widget); label2-setText(QObject:tr(label2:我不是獨立窗口,只是我不是獨立窗口,只是widget的子部件的子部件); label2-resize(250, 20); / 在屏幕上顯示出來在屏幕上顯示出來 label-show(); widge
6、t-show();n在程序中定義了一個在程序中定義了一個QWidget類對象的指針類對象的指針widget和兩個和兩個QLabel對象指針對象指針label與與label2,其中,其中l(wèi)abel沒有父窗口,而沒有父窗口,而label2在在widget中,中,widget是其父是其父窗口。窗口。 n窗口部件窗口部件(Widget)這里簡稱部件,是)這里簡稱部件,是Qt中建立用戶界面的主要元中建立用戶界面的主要元素。像主窗口、對話框、標簽、還有以后要介紹到的按鈕、文本輸入素。像主窗口、對話框、標簽、還有以后要介紹到的按鈕、文本輸入框等都是窗口部件。框等都是窗口部件。n在在Qt中,把沒有嵌入到其他部
7、件中的部件稱為中,把沒有嵌入到其他部件中的部件稱為窗口窗口,一般的,窗口都,一般的,窗口都有邊框和標題欄,就像程序中的有邊框和標題欄,就像程序中的widget和和label一樣。一樣。nQMainWindow和大量的和大量的QDialog子類是最一般的窗口類型。窗口就子類是最一般的窗口類型。窗口就是沒有父部件的部件,所以又稱為是沒有父部件的部件,所以又稱為頂級部件頂級部件(top-level widget)。)。與其相對的是非窗口部件,又稱為與其相對的是非窗口部件,又稱為子部件子部件(child widget)。在)。在Qt中中大部分部件被用作子部件,它們嵌入在別的窗口中,例如程序中的大部分部
8、件被用作子部件,它們嵌入在別的窗口中,例如程序中的label2。 窗口類型窗口類型 前面講到窗口一般都有邊框和標題欄,其實這也不是必需的:前面講到窗口一般都有邊框和標題欄,其實這也不是必需的:nQWidgetQWidget的構造函數(shù)有兩個參數(shù):的構造函數(shù)有兩個參數(shù):QWidgetQWidget * * parent = 0 parent = 0和和Qt:WindowFlagsQt:WindowFlags f = 0 f = 0;n前面的前面的parentparent就是指父窗口部件,默認值為就是指父窗口部件,默認值為0 0,表明沒有父窗口;,表明沒有父窗口;n而后面的而后面的f f參數(shù)是參數(shù)是
9、Qt:WindowFlagsQt:WindowFlags類型的,它是一個枚舉類型,分為類型的,它是一個枚舉類型,分為窗口類型(窗口類型(WindowTypeWindowType)和窗口標志()和窗口標志(WindowFlagsWindowFlags。前者可以定義。前者可以定義窗口的類型,比如我們這里窗口的類型,比如我們這里f=0f=0,表明使用了,表明使用了Qt:WidgetQt:Widget一項,這是一項,這是QWidgetQWidget的默認類型,這種類型的部件如果有父窗口,那么它就是子的默認類型,這種類型的部件如果有父窗口,那么它就是子部件,否則就是獨立的窗口。部件,否則就是獨立的窗口。
10、 例如:使用其中的例如:使用其中的Qt:Dialog和和Qt:SplashScreen,更改程序中的新建對象,更改程序中的新建對象的那兩行代碼:的那兩行代碼:QWidget *widget = new QWidget(0, Qt:Dialog);QLabel *label = new QLabel(0, Qt:SplashScreen); 當更改窗口類型后,窗口的樣式發(fā)生了改變,一個是對話框類型,一個是歡當更改窗口類型后,窗口的樣式發(fā)生了改變,一個是對話框類型,一個是歡迎窗口類型。迎窗口類型。 而對于窗口標志,它主要的作用是更改窗口的標題欄和邊框,而且它們可以而對于窗口標志,它主要的作用是更改
11、窗口的標題欄和邊框,而且它們可以和窗口類型進行位或操作。下面再次更改那兩行代碼:和窗口類型進行位或操作。下面再次更改那兩行代碼:QWidget *widget = new QWidget(0, Qt:Dialog | Qt:FramelessWindowHint);QLabel *label = new QLabel(0, Qt:SplashScreen | Qt:WindowStaysOnTopHint);Qt:FramelessWindowHint用來產(chǎn)生一個沒有邊框的窗口,而用來產(chǎn)生一個沒有邊框的窗口,而Qt:WindowStaysOnTopHint用來使該窗口停留在所有其它窗口上面。用
12、來使該窗口停留在所有其它窗口上面。窗口幾何布局 對于窗口的大小和位置,根據(jù)是否包含邊框和標題欄兩種情況,要用不同的函數(shù)來獲對于窗口的大小和位置,根據(jù)是否包含邊框和標題欄兩種情況,要用不同的函數(shù)來獲取它們的數(shù)值。取它們的數(shù)值。 這里的函數(shù)分為兩類,一類是包含框架的,一類是不包含框架的:這里的函數(shù)分為兩類,一類是包含框架的,一類是不包含框架的:n包含框架:包含框架:x()、y()、frameGeometry()、pos()和和move()等函數(shù);等函數(shù);n不包含框架:不包含框架:geometry()、width()、height()、rect()和和size()等函數(shù)。等函數(shù)。程序調(diào)試程序調(diào)試下面
13、在講解窗口幾何布局的幾個函數(shù)的同時,講解一下程序調(diào)試方面的內(nèi)容。 將主函數(shù)內(nèi)容更改如下:將主函數(shù)內(nèi)容更改如下:#include QApplication#include #include QWidget#include int main(int argc, char int main(int argc, char * *argvargv) QApplication a(argc, argv QApplication a(argc, argv);); QWidget QWidget widget; widget; int x = widget.x int x = widget.x();(); i
14、nt y = widget.y int y = widget.y();(); QRect geometry = widget.geometry QRect geometry = widget.geometry();(); QRect frame = widget.frameGeometry QRect frame = widget.frameGeometry();(); return a.exec return a.exec();(); x()x()、y()y()分別返回部件的位置坐標的分別返回部件的位置坐標的x x、y y值,它們的默認值為值,它們的默認值為0 0。而而geometry()g
15、eometry()和和frameGeometryframeGeometry()()函函數(shù)分別返回沒有邊框和包含邊框的窗數(shù)分別返回沒有邊框和包含邊框的窗口框架矩形的值,其返回值是口框架矩形的值,其返回值是QRectQRect類型的,就是一個矩形,它的形式是類型的,就是一個矩形,它的形式是(位置坐標,大小信息),也就是(位置坐標,大小信息),也就是(x x,y y,寬,高)。,寬,高)。 下面在下面在int x = widget.xint x = widget.x(); (); 一行代碼的標號前面點擊鼠一行代碼的標號前面點擊鼠標左鍵來設置斷點。標左鍵來設置斷點。 所謂所謂斷點斷點,就是程序運行到該
16、行代碼時會暫停下來,從而,就是程序運行到該行代碼時會暫停下來,從而可以查看一些信息,如變量值等。要取消斷點,只要在那可以查看一些信息,如變量值等。要取消斷點,只要在那個斷點上再點擊一下就可以了。設置好斷點后便可以按下個斷點上再點擊一下就可以了。設置好斷點后便可以按下F5F5或者左下角的調(diào)試按鈕開始調(diào)試。這時程序會先進行構或者左下角的調(diào)試按鈕開始調(diào)試。這時程序會先進行構建再進入調(diào)試模式,這個過程可能需要一些時間。在程序建再進入調(diào)試模式,這個過程可能需要一些時間。在程序構建時可能會出現(xiàn)警告,那是因為我們定義了變量卻沒有構建時可能會出現(xiàn)警告,那是因為我們定義了變量卻沒有使用造成的,不用管它。使用造成
17、的,不用管它。 調(diào)試模式下面對調(diào)試模式的幾個按鈕和窗口進行簡單介紹:下面對調(diào)試模式的幾個按鈕和窗口進行簡單介紹:繼續(xù)按鈕。程序在斷點處停了下來,按下繼續(xù)按鈕后,程序便會像正常運行一樣,執(zhí)行繼續(xù)按鈕。程序在斷點處停了下來,按下繼續(xù)按鈕后,程序便會像正常運行一樣,執(zhí)行后面的代碼,直到遇到下一個斷點,或者程序結(jié)束。后面的代碼,直到遇到下一個斷點,或者程序結(jié)束。停止調(diào)試按鈕。按下該按鈕后結(jié)束調(diào)試。停止調(diào)試按鈕。按下該按鈕后結(jié)束調(diào)試。單步跳過按鈕。直接執(zhí)行本行代碼,然后指向下一行代碼。單步跳過按鈕。直接執(zhí)行本行代碼,然后指向下一行代碼。單步進入按鈕。進入調(diào)用的函數(shù)內(nèi)部。單步進入按鈕。進入調(diào)用的函數(shù)內(nèi)部。
18、單步跳出按鈕。當進入函數(shù)內(nèi)部時,跳出該函數(shù),一般與單步進入配合使用。單步跳出按鈕。當進入函數(shù)內(nèi)部時,跳出該函數(shù),一般與單步進入配合使用。顯示源碼對應的匯編指令,并可以單步調(diào)試。顯示源碼對應的匯編指令,并可以單步調(diào)試。堆棧視圖。這里顯示了從程序開始到斷點處,所有嵌套調(diào)用的函數(shù)所在的源文件名和行堆棧視圖。這里顯示了從程序開始到斷點處,所有嵌套調(diào)用的函數(shù)所在的源文件名和行號。號。其它視圖。這里有局部變量和監(jiān)視器視圖,用來顯示局部變量和它們的類型及數(shù)值;斷其它視圖。這里有局部變量和監(jiān)視器視圖,用來顯示局部變量和它們的類型及數(shù)值;斷點視圖用來顯示所有的斷點,以及添加或者刪除斷點;線程視圖用來顯示所有的線
19、程點視圖用來顯示所有的斷點,以及添加或者刪除斷點;線程視圖用來顯示所有的線程和現(xiàn)在所在的線程;快照視圖用來管理快照,快照可以保存當前的調(diào)試狀態(tài)。和現(xiàn)在所在的線程;快照視圖用來管理快照,快照可以保存當前的調(diào)試狀態(tài)。單步調(diào)試單步調(diào)試n點擊一下點擊一下“單步進入單步進入”按鈕,或者按下按鈕,或者按下F11F11,這時,程序會跳轉(zhuǎn)到,這時,程序會跳轉(zhuǎn)到QWidgetQWidget類的類的x()x()函數(shù)的源碼處,這里對這個函數(shù)不做過多講解,下面函數(shù)的源碼處,這里對這個函數(shù)不做過多講解,下面直接按下直接按下“單步跳出單步跳出”按鈕回到原來的斷點處。然后便開始一直按按鈕回到原來的斷點處。然后便開始一直按“
20、單步跳過單步跳過”按鈕,單步執(zhí)行程序,并查看局部變量和監(jiān)視器視圖中按鈕,單步執(zhí)行程序,并查看局部變量和監(jiān)視器視圖中相應變量值的變化情況。等執(zhí)行到最后一行代碼相應變量值的變化情況。等執(zhí)行到最后一行代碼return a.execreturn a.exec();();時,時,按下按下“停止調(diào)試停止調(diào)試”按鈕,結(jié)束調(diào)試。按鈕,結(jié)束調(diào)試。n這里要補充說明一下,我們在程序調(diào)試過程中可以進入到這里要補充說明一下,我們在程序調(diào)試過程中可以進入到QtQt類的源碼類的源碼中,其實還有一個很簡單的方法也可以實現(xiàn)這個功能,就是在編輯器中,其實還有一個很簡單的方法也可以實現(xiàn)這個功能,就是在編輯器中將鼠標光標定位到一個類
21、名或者函數(shù)上,然后按下中將鼠標光標定位到一個類名或者函數(shù)上,然后按下F2F2鍵,或者點擊鍵,或者點擊鼠標右鍵,選擇鼠標右鍵,選擇“跟蹤光標位置的符號跟蹤光標位置的符號”,這時編輯器就會跳轉(zhuǎn)到其,這時編輯器就會跳轉(zhuǎn)到其源碼處。源碼處。n從變量監(jiān)視器中可以看到從變量監(jiān)視器中可以看到x x、y y、geometrygeometry和和frameframe四個變量初始值都四個變量初始值都是一個隨機未知數(shù)。等到調(diào)試完成后,是一個隨機未知數(shù)。等到調(diào)試完成后,x x、y y的值均為的值均為0 0,這是它們的,這是它們的默認值。而默認值。而geometrygeometry的值為的值為640 x480+0+06
22、40 x480+0+0,frameframe的值為的值為639x479+0+0639x479+0+0。 n現(xiàn)在對這些值還不是很清楚,不過,為什么現(xiàn)在對這些值還不是很清楚,不過,為什么x、y的值會是的值會是0呢?我們呢?我們可能會想到,應該是窗口沒有顯示的原因,那么就更改代碼,讓窗口可能會想到,應該是窗口沒有顯示的原因,那么就更改代碼,讓窗口先顯示出來,再看這些值。在先顯示出來,再看這些值。在QWidget widget;一行代碼后添加一行一行代碼后添加一行代碼:代碼: widget.show();n現(xiàn)在再次調(diào)試程序,這時會發(fā)現(xiàn)窗口只顯示了一個標題欄,先不管它,現(xiàn)在再次調(diào)試程序,這時會發(fā)現(xiàn)窗口只
23、顯示了一個標題欄,先不管它,繼續(xù)在繼續(xù)在Qt Creator中點擊中點擊“單步跳過單步跳過”按鈕。當我們將程序運行到最按鈕。當我們將程序運行到最后一行代碼后一行代碼return a.exec();時,再次按下時,再次按下“單步跳過單步跳過”按鈕后,程序按鈕后,程序窗口終于顯示出來了。這是因為只有程序進入主事件循環(huán)后才能接收窗口終于顯示出來了。這是因為只有程序進入主事件循環(huán)后才能接收事件,而事件,而show()函數(shù)會觸發(fā)顯示事件,所以只有在完成函數(shù)會觸發(fā)顯示事件,所以只有在完成a.exe()函數(shù)函數(shù)調(diào)用進入消息循環(huán)后才能正常顯示。這次看到幾個變量的值都有了變調(diào)用進入消息循環(huán)后才能正常顯示。這次看
24、到幾個變量的值都有了變化,但是這時還是不清楚這些值的含義。化,但是這時還是不清楚這些值的含義。n注意注意:因為使用調(diào)試器進行調(diào)試要等待一段時間,而且步驟很麻煩,:因為使用調(diào)試器進行調(diào)試要等待一段時間,而且步驟很麻煩,對于初學者來說,如果按錯了按鈕,還很容易出錯。對于初學者來說,如果按錯了按鈕,還很容易出錯。 所以,并不推所以,并不推薦使用。薦使用。使用使用qDebugqDebug()()函數(shù)函數(shù) 一般在程序調(diào)試過程中很常用的是一般在程序調(diào)試過程中很常用的是qDebugqDebug()()函數(shù),它可以將調(diào)試信函數(shù),它可以將調(diào)試信息直接輸出到控制臺,在息直接輸出到控制臺,在Qt CreatorQt
25、 Creator中是輸出到應用程序輸出欄中是輸出到應用程序輸出欄 。例如:例如: QWidgetQWidget widget; widget; widget.resize(400, 300); / widget.resize(400, 300); / 設置窗口大小設置窗口大小 widget.move(200, 100); / widget.move(200, 100); / 設置窗口位置設置窗口位置 widget.showwidget.show();(); int x = widget.x int x = widget.x();(); qDebug(x qDebug(x: %d, x); /
26、: %d, x); / 輸出輸出x x的值的值 int y = widget.yint y = widget.y();(); qDebug(y qDebug(y: %d, y);: %d, y); QRect geometry = widget.geometry QRect geometry = widget.geometry();(); QRect frame = widget.frameGeometry QRect frame = widget.frameGeometry();(); qDebug qDebug() geometry: geometry frame: frame;() ge
27、ometry: geometry frame: frame; 要使用要使用qDebug()函數(shù),就要添加函數(shù),就要添加#include 頭文件。然后頭文件。然后這里使用了兩種輸出方式:這里使用了兩種輸出方式:n方式一:直接將字符串當做參數(shù)傳給方式一:直接將字符串當做參數(shù)傳給qDebug()函數(shù),例如上面使用函數(shù),例如上面使用這種方法輸出這種方法輸出x和和y的值。的值。n方式二:使用輸出流的方式一次輸出多個值,它們的類型可以不同,方式二:使用輸出流的方式一次輸出多個值,它們的類型可以不同,例如程序中輸出例如程序中輸出geometry和和frame的值。的值。n需要說明的是,如果只使用第一種方法,
28、那么是不需要添加需要說明的是,如果只使用第一種方法,那么是不需要添加頭文件的,如果使用第二種方法就必須添加這個頭文件。頭文件的,如果使用第二種方法就必須添加這個頭文件。因為第一種方法很麻煩,所以經(jīng)常使用的是第二種方法。因為第一種方法很麻煩,所以經(jīng)常使用的是第二種方法。n從輸出信息中,可以清楚的看到幾個函數(shù)的含義了。從輸出信息中,可以清楚的看到幾個函數(shù)的含義了。 n其實使用其實使用qDebugqDebug()()函數(shù)的第二種方法時還可以讓輸出自動換行,下面來看一函數(shù)的第二種方法時還可以讓輸出自動換行,下面來看一下其他幾個函數(shù)的用法。在下其他幾個函數(shù)的用法。在return a.execreturn
29、 a.exec();();一行代碼前添加如下代碼:一行代碼前添加如下代碼:qDebug() pos: widget.pos() endl rect: widget.rectqDebug() pos: widget.pos() endl rect: widget.rect()() endl size: widget.size() endl endl size: widget.size() endl width: width: widget.width() endl height: widget.height widget.width() endl height: show();dialog-sh
30、ow(); 使用使用show()show()函數(shù)也可以建立模態(tài)對話框,只需在其前面使用函數(shù)也可以建立模態(tài)對話框,只需在其前面使用setModalsetModal()()函數(shù)函數(shù)即可。例如:即可。例如:QDialog QDialog * *dialog = new QDialog(thisdialog = new QDialog(this););dialog-setModal(truedialog-setModal(true););dialog-show();dialog-show();現(xiàn)在運行程序,可以看到生成的對話框是模態(tài)的。但是,它與用現(xiàn)在運行程序,可以看到生成的對話框是模態(tài)的。但是,它與
31、用exec()exec()函數(shù)函數(shù)時的效果是不一樣的。這是因為調(diào)用完時的效果是不一樣的。這是因為調(diào)用完show()show()函數(shù)后會立即將控制權交給調(diào)函數(shù)后會立即將控制權交給調(diào)用者,那么程序可以繼續(xù)往下執(zhí)行。而調(diào)用用者,那么程序可以繼續(xù)往下執(zhí)行。而調(diào)用exec()exec()函數(shù)卻不是這樣,它只有函數(shù)卻不是這樣,它只有當對話框被關閉時才會返回。當對話框被關閉時才會返回。 與與setModalsetModal()()函數(shù)相似的還有一個函數(shù)相似的還有一個setWindowModalitysetWindowModality()()函數(shù),它有一個參函數(shù),它有一個參數(shù)來設置模態(tài)對話框要阻塞的窗口類型,
32、可以是:數(shù)來設置模態(tài)對話框要阻塞的窗口類型,可以是:nQt:NonModalQt:NonModal(不阻塞任何窗口,就是非模態(tài)),(不阻塞任何窗口,就是非模態(tài)),nQt:WindowModalQt:WindowModal(阻塞它的父窗口和所有祖先窗口以及它們的子窗口),(阻塞它的父窗口和所有祖先窗口以及它們的子窗口),nQt:ApplicationModalQt:ApplicationModal(阻塞整個應用程序的所有窗口)。(阻塞整個應用程序的所有窗口)。 而而setModalsetModal()()函數(shù)默認設置的是函數(shù)默認設置的是Qt:ApplicationModalQt:Applicat
33、ionModal。多窗口切換多窗口切換 本節(jié)會涉及如下內(nèi)容:本節(jié)會涉及如下內(nèi)容:n開始認識信號和槽開始認識信號和槽n信號和槽的關聯(lián)方式信號和槽的關聯(lián)方式n從登陸對話框顯示主界面的方法從登陸對話框顯示主界面的方法開始認識信號和槽開始認識信號和槽 在在QtQt中使用信號和槽機制來完成對象之間的協(xié)同操作。中使用信號和槽機制來完成對象之間的協(xié)同操作。 簡單來說,信號和槽都是函數(shù),比如按下窗口上的一個按簡單來說,信號和槽都是函數(shù),比如按下窗口上的一個按鈕后想要彈出一個對話框,那么就可以將這個按鈕的單擊鈕后想要彈出一個對話框,那么就可以將這個按鈕的單擊信號和我們定義的槽關聯(lián)起來,在這個槽中可以創(chuàng)建一個信號
34、和我們定義的槽關聯(lián)起來,在這個槽中可以創(chuàng)建一個對話框,并且顯示它。這樣,當單擊這個按鈕時就會發(fā)射對話框,并且顯示它。這樣,當單擊這個按鈕時就會發(fā)射信號,進而執(zhí)行我們的槽來顯示一個對話框。信號,進而執(zhí)行我們的槽來顯示一個對話框。 關聯(lián)方式一:使用connect()關聯(lián)nmywidget.h文件寫上槽的聲明 :public slots:void showChildDialog();n在mywidget.cpp文件中將槽的實現(xiàn) :void MyWidget:showChildDialog() QDialog *dialog = new QDialog(this); dialog-show();n在m
35、ywidget.cpp文件的MyWidget類的構造函數(shù)中使用connect()關聯(lián)按鈕單擊信號和自定義的槽如下:connect(ui-showChildButton, SIGNAL(clicked(), this, SLOT(showChildDialog();說明:n這里自定義了一個槽,槽必須聲明為這里自定義了一個槽,槽必須聲明為slots,這里使用了,這里使用了public slots,表明這個槽可以在類外被調(diào)用。,表明這個槽可以在類外被調(diào)用。 nclicked()信號在信號在QPushButton類中進行了定義,而類中進行了定義,而connect()是是QObject類中的函數(shù),因為我
36、們的類繼承自類中的函數(shù),因為我們的類繼承自QObject,所以可以直接使用它。,所以可以直接使用它。 nconnect()函數(shù)中的四個參數(shù)分別是:發(fā)送信號的對象、函數(shù)中的四個參數(shù)分別是:發(fā)送信號的對象、發(fā)送的信號、接收信號的對象和要執(zhí)行的槽,而信號和槽發(fā)送的信號、接收信號的對象和要執(zhí)行的槽,而信號和槽要分別使用要分別使用SIGNAL()和和SLOT()宏括起來。宏括起來。 關聯(lián)方式二:在設計模式關聯(lián)n首先添加自定義對話框類首先添加自定義對話框類MyDialogMyDialog。在設計模式中向窗口上添加兩個。在設計模式中向窗口上添加兩個Push Push ButtonButton,并且分別更改其
37、顯示文本為,并且分別更改其顯示文本為“進入主界面進入主界面”和和“退出程序退出程序”。n點擊設計器上方的點擊設計器上方的“編輯信號編輯信號/ /槽槽”圖標,或者按下快捷鍵圖標,或者按下快捷鍵F4F4,這時便進入了,這時便進入了部件的信號和槽的編輯模式。在部件的信號和槽的編輯模式。在“退出程序退出程序”按鈕上按住鼠標左鍵,然后拖按鈕上按住鼠標左鍵,然后拖動到窗口界面上,這時松開鼠標左鍵。在彈出的配置連接對話框中,選中下動到窗口界面上,這時松開鼠標左鍵。在彈出的配置連接對話框中,選中下面的面的“顯示從顯示從QWidgetQWidget繼承的信號和槽繼承的信號和槽”選項,然后在左邊的選項,然后在左邊
38、的QPushButtonQPushButton欄欄中選擇信號中選擇信號clicked()clicked(),在右邊的,在右邊的QDialogQDialog欄中選擇對應的槽欄中選擇對應的槽close()close(),完成,完成后按下后按下“確定確定”。關聯(lián)方式三:自動關聯(lián) 該按鈕上點擊鼠標右鍵,在彈出的菜單上選擇該按鈕上點擊鼠標右鍵,在彈出的菜單上選擇“轉(zhuǎn)到槽轉(zhuǎn)到槽”,然后在彈出的對,然后在彈出的對話框中選擇話框中選擇clicked()clicked()信號,并按信號,并按“確定確定”。這時便會進入代碼編輯模式,。這時便會進入代碼編輯模式,并且定位到自動生成的并且定位到自動生成的on_push
39、Button_clickedon_pushButton_clicked()()槽中。在其中添加代碼:槽中。在其中添加代碼:void MyDialog:on_pushButton_clickedvoid MyDialog:on_pushButton_clicked()() acceptaccept(); (); n自動關聯(lián)就是將關聯(lián)函數(shù)整合到槽命名中,但必須使用自動關聯(lián)就是將關聯(lián)函數(shù)整合到槽命名中,但必須使用Qt部件已經(jīng)提部件已經(jīng)提供的信號。供的信號。n例如例如on_pushButton_clicked()就是由字符就是由字符“on”和發(fā)射信號的部件和發(fā)射信號的部件對象名,還有信號名組成。這樣就
40、可以去掉那個對象名,還有信號名組成。這樣就可以去掉那個connect()關聯(lián)函數(shù)關聯(lián)函數(shù)了。每當了。每當pushButton被按下,就好發(fā)射被按下,就好發(fā)射clicked()信號,然后就會執(zhí)信號,然后就會執(zhí)行行on_pushButton_clicked()槽。槽。n這里這里accept()函數(shù)是函數(shù)是QDialog類中的一個槽,對于一個使用類中的一個槽,對于一個使用exec()函函數(shù)實現(xiàn)的模態(tài)對話框,執(zhí)行了這個槽,就會隱藏這個模態(tài)對話框,并數(shù)實現(xiàn)的模態(tài)對話框,執(zhí)行了這個槽,就會隱藏這個模態(tài)對話框,并返回返回QDialog:Accepted值,我們就是要使用這個值來判斷是哪個按值,我們就是要使用
41、這個值來判斷是哪個按鈕被按下了。與其對應的還有一個鈕被按下了。與其對應的還有一個reject()槽,它可以返回一個槽,它可以返回一個QDialog:Rejected值。其實,前面的值。其實,前面的“退出程序退出程序”按鈕也可以關聯(lián)按鈕也可以關聯(lián)這個槽。這個槽。使用自定義對話框登陸主界面使用自定義對話框登陸主界面在在main()函數(shù)中:函數(shù)中: QApplication a(argc, argv); MyWidget w; MyDialog dialog; / 新建新建MyDialog類對象類對象 if(dialog.exec()=QDialog:Accepted) / 判斷判斷dialog執(zhí)行
42、結(jié)果執(zhí)行結(jié)果 w.show(); / 如果是按下了如果是按下了“進入主界面進入主界面”按鈕,則顯示主界面按鈕,則顯示主界面 return a.exec(); / 程序正常運行程序正常運行 else return 0; 在主函數(shù)中建立了在主函數(shù)中建立了MyDialog對象,然后判斷其對象,然后判斷其exec()函數(shù)的返回值,如果是函數(shù)的返回值,如果是按下了按下了“進入主界面進入主界面”按鈕,那么返回值應該是按鈕,那么返回值應該是QDialog:Accepted,就顯,就顯示主界面,并且正常執(zhí)行程序。如果不是,則直接退出程序。示主界面,并且正常執(zhí)行程序。如果不是,則直接退出程序。標準對話框標準對話
43、框 Qt Qt提供了一些常用的對話框類型,它們?nèi)坷^承自提供了一些常用的對話框類型,它們?nèi)坷^承自QDialogQDialog類,并增加了自類,并增加了自己的特色功能,比如獲取顏色、顯示特定信息等。己的特色功能,比如獲取顏色、顯示特定信息等。 n顏色對話框顏色對話框 n文件對話框文件對話框 n字體對話框字體對話框 n輸入對話框輸入對話框 n消息對話框消息對話框 n進度對話框進度對話框 n錯誤信息對話框錯誤信息對話框 n向?qū)υ捒蛳驅(qū)υ捒?顏色對話框例如:例如:QColor color = QColorDialog:getColor(Qt:red, this, trQColor color =
44、 QColorDialog:getColor(Qt:red, this, tr(顏色對話框顏色對話框););qDebugqDebug() color: color;() color: color; 這里使用了這里使用了QColorDialog的靜態(tài)函數(shù)的靜態(tài)函數(shù)getColor()來獲取顏色,它的三個參數(shù)來獲取顏色,它的三個參數(shù)的作用分別是:設置初始顏色、父窗口和對話框標題。這里的的作用分別是:設置初始顏色、父窗口和對話框標題。這里的Qt:red,是,是Qt預定義的顏色對象。預定義的顏色對象。n如果想要更靈活的設置時,可以先創(chuàng)建對象,然后進行各項設置:如果想要更靈活的設置時,可以先創(chuàng)建對象,然
45、后進行各項設置:void MyWidget:on_pushButton_clicked() QColorDialog dialog(Qt:red,this); / 創(chuàng)建對象創(chuàng)建對象 dialog.setOption(QColorDialog:ShowAlphaChannel); / 顯示顯示alpha選項選項 dialog.exec(); / 以模態(tài)方式運行對話框以模態(tài)方式運行對話框 QColor color = dialog.currentColor(); / 獲取當前顏色獲取當前顏色 qDebug()color:label-setPixmap(QPixmap(F:/logo.pngui-l
46、abel-setPixmap(QPixmap(F:/logo.png););n還可以顯示還可以顯示gifgif動態(tài)圖片:動態(tài)圖片:QMovie QMovie * *movie = new QMovie(F:/donghua.gifmovie = new QMovie(F:/donghua.gif););ui-label-setMovie(movieui-label-setMovie(movie); / ); / 在標簽中添加動畫在標簽中添加動畫movie-start(); movie-start(); 按鈕部件按鈕部件 QAbstractButton類是按鈕部件的抽象基類,提供了按鈕類是按鈕部
47、件的抽象基類,提供了按鈕的通用功能。它的子類包括:的通用功能。它的子類包括:n復選框復選框QCheckBoxn標準按鈕標準按鈕QPushButtonn單選框按鈕單選框按鈕QRadioButtonn工具按鈕工具按鈕QToolButton。 例:例:QPushButton 在下面代碼里為三個按鈕改變了顯示文本,這里在一個字母前加上在下面代碼里為三個按鈕改變了顯示文本,這里在一個字母前加上“&”&”符符號,那么就可以將這個按鈕的加速鍵設置為號,那么就可以將這個按鈕的加速鍵設置為AltAlt加上這個字母。如果我們要在加上這個字母。如果我們要在文本中顯示文本中顯示“&”&
48、”符號本身,那么可以使用符號本身,那么可以使用“&”&”。我們也可以使用。我們也可以使用setIconsetIcon()()函數(shù)來給按鈕添加圖標,這里圖片文件使用了相對路徑(當然這函數(shù)來給按鈕添加圖標,這里圖片文件使用了相對路徑(當然這個也可以在設計模式通過更改個也可以在設計模式通過更改iconicon屬性來實現(xiàn))。對于屬性來實現(xiàn))。對于pushBtn3pushBtn3,我們?yōu)槠?,我們?yōu)槠涮砑恿讼吕藛?,當然,現(xiàn)在這個菜單什么功能也沒實現(xiàn)。添加了下拉菜單,當然,現(xiàn)在這個菜單什么功能也沒實現(xiàn)。ui-pushBtn1-setText(tr(&nihaoui-pushBtn1
49、-setText(tr(&nihao); / ); / 這樣便指定了這樣便指定了Alt+NAlt+N為加速鍵為加速鍵ui-pushBtn2-setText(trui-pushBtn2-setText(tr(幫助幫助(&H);(&H);ui-pushBtn2-setIcon(QIcon(./image/help.pngui-pushBtn2-setIcon(QIcon(./image/help.png););ui-pushBtn3-setText(tr(z&oomui-pushBtn3-setText(tr(z&oom););QMenu QMenu * *
50、menu = new QMenu(thismenu = new QMenu(this););menu-addAction(QIcon(./image/zoom-in.png), trmenu-addAction(QIcon(./image/zoom-in.png), tr(放大放大););ui-pushBtn3-setMenu(menuui-pushBtn3-setMenu(menu);); 行編輯器行編輯器 行編輯器QLineEdit部件是一個單行的文本編輯器,它允許用戶輸入和編輯單行的純文本內(nèi)容,而且提供了一系列有用的功能,包括撤銷與恢復、剪切和拖放等操作。 例如:n顯示模式顯示模式 n輸入掩碼輸入掩碼 n輸入驗證
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 服裝設計中的傳統(tǒng)文化融合與創(chuàng)新考核試卷
- 危險廢物處理與環(huán)保產(chǎn)業(yè)市場準入制度考核試卷
- 住宅建筑與社區(qū)居民社區(qū)兒童教育考核試卷
- 勘察項目項目管理海洋工程海洋環(huán)境保護與勘察考核試卷
- 托兒所服務的沉浸式教育與虛擬現(xiàn)實考核試卷
- 托兒所服務的安全管理與緊急救援考核試卷
- 地質(zhì)勘探設備在地震勘探中的物聯(lián)網(wǎng)應用案例考核試卷
- 微特電機散熱問題解決方案考核試卷
- 鎖匯合同范本
- 外賣小哥租車合同范本
- 新材料概論課件ppt 第8章 新能源材料
- 毛概課說課課件
- 冷庫熱氟融霜操作
- 考生個人簡歷及自述表
- 風電機組偏航誤差產(chǎn)生機理及調(diào)整策略研究
- GB/T 18684-2002鋅鉻涂層技術條件
- 第九講:信息與大數(shù)據(jù)倫理問題-工程倫理
- 四年級美術素養(yǎng)附答案
- 2021年全國中學生天文奧林匹克競賽預賽試題及答案
- 四年級下冊音樂教案-2.2我們美麗的祖國 |接力版
- Quantum軟件培訓手冊
評論
0/150
提交評論