Qt Creator快速入門 第三章 窗口部件_第1頁(yè)
Qt Creator快速入門 第三章 窗口部件_第2頁(yè)
Qt Creator快速入門 第三章 窗口部件_第3頁(yè)
Qt Creator快速入門 第三章 窗口部件_第4頁(yè)
Qt Creator快速入門 第三章 窗口部件_第5頁(yè)
已閱讀5頁(yè),還剩38頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、Qt Creator快速入門快速入門第第2版版第第3 3章章 窗口部件窗口部件(1課時(shí)) 前一章中第一次建立前一章中第一次建立helloworldhelloworld程序時(shí),曾看到程序時(shí),曾看到Qt CreatorQt Creator提供的默認(rèn)基類提供的默認(rèn)基類只有只有QMainWindowQMainWindow、QWidgetQWidget和和QDialogQDialog三種。是的,這三種窗體也是以后用三種。是的,這三種窗體也是以后用的最多的,的最多的,QMainWindowQMainWindow是帶有菜單欄和工具欄的主窗口類,是帶有菜單欄和工具欄的主窗口類,QDialogQDialog是各

2、種是各種對(duì)話框的基類,而它們二者全部繼承自對(duì)話框的基類,而它們二者全部繼承自QWidgetQWidget。不僅如此,其實(shí)所有的窗。不僅如此,其實(shí)所有的窗口部件都繼承自口部件都繼承自QWidgetQWidget。主主 要要 內(nèi)內(nèi) 容容n3.1 基礎(chǔ)窗口部件基礎(chǔ)窗口部件QWidgetn3.2 對(duì)話框?qū)υ捒騋Dialogn3.3 其他窗口部件其他窗口部件n3.4 小結(jié)小結(jié)3.1 基礎(chǔ)窗口部件基礎(chǔ)窗口部件QWidget QWidgetQWidget類是所有用戶界面對(duì)象的基類,被稱為基礎(chǔ)窗口類是所有用戶界面對(duì)象的基類,被稱為基礎(chǔ)窗口部件。部件。QWidgetQWidget繼承自繼承自QObjectQOb

3、ject類和類和QPaintDeviceQPaintDevice類,其中類,其中QObjectQObject類是所有支持類是所有支持QtQt對(duì)象模型(對(duì)象模型(Qt Object ModelQt Object Model)的)的QtQt對(duì)象的的基類,對(duì)象的的基類,QPaintDeviceQPaintDevice類是所有可以繪制的對(duì)象類是所有可以繪制的對(duì)象的基類。本節(jié)內(nèi)容:的基類。本節(jié)內(nèi)容:n窗口、子部件以及窗口類型窗口、子部件以及窗口類型n窗口幾何布局窗口幾何布局 n程序調(diào)試程序調(diào)試 窗口、子部件以及窗口類型窗口、子部件以及窗口類型來(lái)看一個(gè)代碼片段:來(lái)看一個(gè)代碼片段: / 新建新建QWidge

4、t類對(duì)象,默認(rèn)類對(duì)象,默認(rèn)parent參數(shù)是參數(shù)是0,所以它是個(gè)窗口,所以它是個(gè)窗口 QWidget *widget = new QWidget(); / 設(shè)置窗口標(biāo)題設(shè)置窗口標(biāo)題 widget-setWindowTitle(QObject:tr(我是我是widget); / 新建新建QLabel對(duì)象,默認(rèn)對(duì)象,默認(rèn)parent參數(shù)是參數(shù)是0,所以它是個(gè)窗口,所以它是個(gè)窗口 QLabel *label = new QLabel(); label-setWindowTitle(QObject:tr(我是我是label); / 設(shè)置要顯示的信息設(shè)置要顯示的信息 label-setText(QObj

5、ect:tr(label:我是個(gè)窗口我是個(gè)窗口); / 改變部件大小,以便能顯示出完整的內(nèi)容改變部件大小,以便能顯示出完整的內(nèi)容 label-resize(180, 20); / label2指定了父窗口為指定了父窗口為widget,所以不是窗口,所以不是窗口 QLabel *label2 = new QLabel(widget); label2-setText(QObject:tr(label2:我不是獨(dú)立窗口,只是我不是獨(dú)立窗口,只是widget的子部件的子部件); label2-resize(250, 20); / 在屏幕上顯示出來(lái)在屏幕上顯示出來(lái) label-show(); widge

6、t-show();n在程序中定義了一個(gè)在程序中定義了一個(gè)QWidget類對(duì)象的指針類對(duì)象的指針widget和兩個(gè)和兩個(gè)QLabel對(duì)象指針對(duì)象指針label與與label2,其中,其中l(wèi)abel沒(méi)有父窗口,而沒(méi)有父窗口,而label2在在widget中,中,widget是其父是其父窗口。窗口。 n窗口部件窗口部件(Widget)這里簡(jiǎn)稱部件,是)這里簡(jiǎn)稱部件,是Qt中建立用戶界面的主要元中建立用戶界面的主要元素。像主窗口、對(duì)話框、標(biāo)簽、還有以后要介紹到的按鈕、文本輸入素。像主窗口、對(duì)話框、標(biāo)簽、還有以后要介紹到的按鈕、文本輸入框等都是窗口部件??虻榷际谴翱诓考在在Qt中,把沒(méi)有嵌入到其他部

7、件中的部件稱為中,把沒(méi)有嵌入到其他部件中的部件稱為窗口窗口,一般的,窗口都,一般的,窗口都有邊框和標(biāo)題欄,就像程序中的有邊框和標(biāo)題欄,就像程序中的widget和和label一樣。一樣。nQMainWindow和大量的和大量的QDialog子類是最一般的窗口類型。窗口就子類是最一般的窗口類型。窗口就是沒(méi)有父部件的部件,所以又稱為是沒(méi)有父部件的部件,所以又稱為頂級(jí)部件頂級(jí)部件(top-level widget)。)。與其相對(duì)的是非窗口部件,又稱為與其相對(duì)的是非窗口部件,又稱為子部件子部件(child widget)。在)。在Qt中中大部分部件被用作子部件,它們嵌入在別的窗口中,例如程序中的大部分部

8、件被用作子部件,它們嵌入在別的窗口中,例如程序中的label2。 窗口類型窗口類型 前面講到窗口一般都有邊框和標(biāo)題欄,其實(shí)這也不是必需的:前面講到窗口一般都有邊框和標(biāo)題欄,其實(shí)這也不是必需的:nQWidgetQWidget的構(gòu)造函數(shù)有兩個(gè)參數(shù):的構(gòu)造函數(shù)有兩個(gè)參數(shù):QWidgetQWidget * * parent = 0 parent = 0和和Qt:WindowFlagsQt:WindowFlags f = 0 f = 0;n前面的前面的parentparent就是指父窗口部件,默認(rèn)值為就是指父窗口部件,默認(rèn)值為0 0,表明沒(méi)有父窗口;,表明沒(méi)有父窗口;n而后面的而后面的f f參數(shù)是參數(shù)是

9、Qt:WindowFlagsQt:WindowFlags類型的,它是一個(gè)枚舉類型,分為類型的,它是一個(gè)枚舉類型,分為窗口類型(窗口類型(WindowTypeWindowType)和窗口標(biāo)志()和窗口標(biāo)志(WindowFlagsWindowFlags。前者可以定義。前者可以定義窗口的類型,比如我們這里窗口的類型,比如我們這里f=0f=0,表明使用了,表明使用了Qt:WidgetQt:Widget一項(xiàng),這是一項(xiàng),這是QWidgetQWidget的默認(rèn)類型,這種類型的部件如果有父窗口,那么它就是子的默認(rèn)類型,這種類型的部件如果有父窗口,那么它就是子部件,否則就是獨(dú)立的窗口。部件,否則就是獨(dú)立的窗口。

10、 例如:使用其中的例如:使用其中的Qt:Dialog和和Qt:SplashScreen,更改程序中的新建對(duì)象,更改程序中的新建對(duì)象的那兩行代碼:的那兩行代碼:QWidget *widget = new QWidget(0, Qt:Dialog);QLabel *label = new QLabel(0, Qt:SplashScreen); 當(dāng)更改窗口類型后,窗口的樣式發(fā)生了改變,一個(gè)是對(duì)話框類型,一個(gè)是歡當(dāng)更改窗口類型后,窗口的樣式發(fā)生了改變,一個(gè)是對(duì)話框類型,一個(gè)是歡迎窗口類型。迎窗口類型。 而對(duì)于窗口標(biāo)志,它主要的作用是更改窗口的標(biāo)題欄和邊框,而且它們可以而對(duì)于窗口標(biāo)志,它主要的作用是更改

11、窗口的標(biāo)題欄和邊框,而且它們可以和窗口類型進(jìn)行位或操作。下面再次更改那兩行代碼:和窗口類型進(jìn)行位或操作。下面再次更改那兩行代碼:QWidget *widget = new QWidget(0, Qt:Dialog | Qt:FramelessWindowHint);QLabel *label = new QLabel(0, Qt:SplashScreen | Qt:WindowStaysOnTopHint);Qt:FramelessWindowHint用來(lái)產(chǎn)生一個(gè)沒(méi)有邊框的窗口,而用來(lái)產(chǎn)生一個(gè)沒(méi)有邊框的窗口,而Qt:WindowStaysOnTopHint用來(lái)使該窗口停留在所有其它窗口上面。用

12、來(lái)使該窗口停留在所有其它窗口上面。窗口幾何布局 對(duì)于窗口的大小和位置,根據(jù)是否包含邊框和標(biāo)題欄兩種情況,要用不同的函數(shù)來(lái)獲對(duì)于窗口的大小和位置,根據(jù)是否包含邊框和標(biāo)題欄兩種情況,要用不同的函數(shù)來(lái)獲取它們的數(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、在講解窗口幾何布局的幾個(gè)函數(shù)的同時(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()分別返回部件的位置坐標(biāo)的分別返回部件的位置坐標(biāo)的x x、y y值,它們的默認(rèn)值為值,它們的默認(rèn)值為0 0。而而geometry()g

15、eometry()和和frameGeometryframeGeometry()()函函數(shù)分別返回沒(méi)有邊框和包含邊框的窗數(shù)分別返回沒(méi)有邊框和包含邊框的窗口框架矩形的值,其返回值是口框架矩形的值,其返回值是QRectQRect類型的,就是一個(gè)矩形,它的形式是類型的,就是一個(gè)矩形,它的形式是(位置坐標(biāo),大小信息),也就是(位置坐標(biāo),大小信息),也就是(x x,y y,寬,高)。,寬,高)。 下面在下面在int x = widget.xint x = widget.x(); (); 一行代碼的標(biāo)號(hào)前面點(diǎn)擊鼠一行代碼的標(biāo)號(hào)前面點(diǎn)擊鼠標(biāo)左鍵來(lái)設(shè)置斷點(diǎn)。標(biāo)左鍵來(lái)設(shè)置斷點(diǎn)。 所謂所謂斷點(diǎn)斷點(diǎn),就是程序運(yùn)行到該

16、行代碼時(shí)會(huì)暫停下來(lái),從而,就是程序運(yùn)行到該行代碼時(shí)會(huì)暫停下來(lái),從而可以查看一些信息,如變量值等。要取消斷點(diǎn),只要在那可以查看一些信息,如變量值等。要取消斷點(diǎn),只要在那個(gè)斷點(diǎn)上再點(diǎn)擊一下就可以了。設(shè)置好斷點(diǎn)后便可以按下個(gè)斷點(diǎn)上再點(diǎn)擊一下就可以了。設(shè)置好斷點(diǎn)后便可以按下F5F5或者左下角的調(diào)試按鈕開(kāi)始調(diào)試。這時(shí)程序會(huì)先進(jìn)行構(gòu)或者左下角的調(diào)試按鈕開(kāi)始調(diào)試。這時(shí)程序會(huì)先進(jìn)行構(gòu)建再進(jìn)入調(diào)試模式,這個(gè)過(guò)程可能需要一些時(shí)間。在程序建再進(jìn)入調(diào)試模式,這個(gè)過(guò)程可能需要一些時(shí)間。在程序構(gòu)建時(shí)可能會(huì)出現(xiàn)警告,那是因?yàn)槲覀兌x了變量卻沒(méi)有構(gòu)建時(shí)可能會(huì)出現(xiàn)警告,那是因?yàn)槲覀兌x了變量卻沒(méi)有使用造成的,不用管它。使用造成

17、的,不用管它。 調(diào)試模式下面對(duì)調(diào)試模式的幾個(gè)按鈕和窗口進(jìn)行簡(jiǎn)單介紹:下面對(duì)調(diào)試模式的幾個(gè)按鈕和窗口進(jìn)行簡(jiǎn)單介紹:繼續(xù)按鈕。程序在斷點(diǎn)處停了下來(lái),按下繼續(xù)按鈕后,程序便會(huì)像正常運(yùn)行一樣,執(zhí)行繼續(xù)按鈕。程序在斷點(diǎn)處停了下來(lái),按下繼續(xù)按鈕后,程序便會(huì)像正常運(yùn)行一樣,執(zhí)行后面的代碼,直到遇到下一個(gè)斷點(diǎn),或者程序結(jié)束。后面的代碼,直到遇到下一個(gè)斷點(diǎn),或者程序結(jié)束。停止調(diào)試按鈕。按下該按鈕后結(jié)束調(diào)試。停止調(diào)試按鈕。按下該按鈕后結(jié)束調(diào)試。單步跳過(guò)按鈕。直接執(zhí)行本行代碼,然后指向下一行代碼。單步跳過(guò)按鈕。直接執(zhí)行本行代碼,然后指向下一行代碼。單步進(jìn)入按鈕。進(jìn)入調(diào)用的函數(shù)內(nèi)部。單步進(jìn)入按鈕。進(jìn)入調(diào)用的函數(shù)內(nèi)部。

18、單步跳出按鈕。當(dāng)進(jìn)入函數(shù)內(nèi)部時(shí),跳出該函數(shù),一般與單步進(jìn)入配合使用。單步跳出按鈕。當(dāng)進(jìn)入函數(shù)內(nèi)部時(shí),跳出該函數(shù),一般與單步進(jìn)入配合使用。顯示源碼對(duì)應(yīng)的匯編指令,并可以單步調(diào)試。顯示源碼對(duì)應(yīng)的匯編指令,并可以單步調(diào)試。堆棧視圖。這里顯示了從程序開(kāi)始到斷點(diǎn)處,所有嵌套調(diào)用的函數(shù)所在的源文件名和行堆棧視圖。這里顯示了從程序開(kāi)始到斷點(diǎn)處,所有嵌套調(diào)用的函數(shù)所在的源文件名和行號(hào)。號(hào)。其它視圖。這里有局部變量和監(jiān)視器視圖,用來(lái)顯示局部變量和它們的類型及數(shù)值;斷其它視圖。這里有局部變量和監(jiān)視器視圖,用來(lái)顯示局部變量和它們的類型及數(shù)值;斷點(diǎn)視圖用來(lái)顯示所有的斷點(diǎn),以及添加或者刪除斷點(diǎn);線程視圖用來(lái)顯示所有的線

19、程點(diǎn)視圖用來(lái)顯示所有的斷點(diǎn),以及添加或者刪除斷點(diǎn);線程視圖用來(lái)顯示所有的線程和現(xiàn)在所在的線程;快照視圖用來(lái)管理快照,快照可以保存當(dāng)前的調(diào)試狀態(tài)。和現(xiàn)在所在的線程;快照視圖用來(lái)管理快照,快照可以保存當(dāng)前的調(diào)試狀態(tài)。單步調(diào)試單步調(diào)試n點(diǎn)擊一下點(diǎn)擊一下“單步進(jìn)入單步進(jìn)入”按鈕,或者按下按鈕,或者按下F11F11,這時(shí),程序會(huì)跳轉(zhuǎn)到,這時(shí),程序會(huì)跳轉(zhuǎn)到QWidgetQWidget類的類的x()x()函數(shù)的源碼處,這里對(duì)這個(gè)函數(shù)不做過(guò)多講解,下面函數(shù)的源碼處,這里對(duì)這個(gè)函數(shù)不做過(guò)多講解,下面直接按下直接按下“單步跳出單步跳出”按鈕回到原來(lái)的斷點(diǎn)處。然后便開(kāi)始一直按按鈕回到原來(lái)的斷點(diǎn)處。然后便開(kāi)始一直按“

20、單步跳過(guò)單步跳過(guò)”按鈕,單步執(zhí)行程序,并查看局部變量和監(jiān)視器視圖中按鈕,單步執(zhí)行程序,并查看局部變量和監(jiān)視器視圖中相應(yīng)變量值的變化情況。等執(zhí)行到最后一行代碼相應(yīng)變量值的變化情況。等執(zhí)行到最后一行代碼return a.execreturn a.exec();();時(shí),時(shí),按下按下“停止調(diào)試停止調(diào)試”按鈕,結(jié)束調(diào)試。按鈕,結(jié)束調(diào)試。n這里要補(bǔ)充說(shuō)明一下,我們?cè)诔绦蛘{(diào)試過(guò)程中可以進(jìn)入到這里要補(bǔ)充說(shuō)明一下,我們?cè)诔绦蛘{(diào)試過(guò)程中可以進(jìn)入到QtQt類的源碼類的源碼中,其實(shí)還有一個(gè)很簡(jiǎn)單的方法也可以實(shí)現(xiàn)這個(gè)功能,就是在編輯器中,其實(shí)還有一個(gè)很簡(jiǎn)單的方法也可以實(shí)現(xiàn)這個(gè)功能,就是在編輯器中將鼠標(biāo)光標(biāo)定位到一個(gè)類

21、名或者函數(shù)上,然后按下中將鼠標(biāo)光標(biāo)定位到一個(gè)類名或者函數(shù)上,然后按下F2F2鍵,或者點(diǎn)擊鍵,或者點(diǎn)擊鼠標(biāo)右鍵,選擇鼠標(biāo)右鍵,選擇“跟蹤光標(biāo)位置的符號(hào)跟蹤光標(biāo)位置的符號(hào)”,這時(shí)編輯器就會(huì)跳轉(zhuǎn)到其,這時(shí)編輯器就會(huì)跳轉(zhuǎn)到其源碼處。源碼處。n從變量監(jiān)視器中可以看到從變量監(jiān)視器中可以看到x x、y y、geometrygeometry和和frameframe四個(gè)變量初始值都四個(gè)變量初始值都是一個(gè)隨機(jī)未知數(shù)。等到調(diào)試完成后,是一個(gè)隨機(jī)未知數(shù)。等到調(diào)試完成后,x x、y y的值均為的值均為0 0,這是它們的,這是它們的默認(rèn)值。而默認(rèn)值。而geometrygeometry的值為的值為640 x480+0+06

22、40 x480+0+0,frameframe的值為的值為639x479+0+0639x479+0+0。 n現(xiàn)在對(duì)這些值還不是很清楚,不過(guò),為什么現(xiàn)在對(duì)這些值還不是很清楚,不過(guò),為什么x、y的值會(huì)是的值會(huì)是0呢?我們呢?我們可能會(huì)想到,應(yīng)該是窗口沒(méi)有顯示的原因,那么就更改代碼,讓窗口可能會(huì)想到,應(yīng)該是窗口沒(méi)有顯示的原因,那么就更改代碼,讓窗口先顯示出來(lái),再看這些值。在先顯示出來(lái),再看這些值。在QWidget widget;一行代碼后添加一行一行代碼后添加一行代碼:代碼: widget.show();n現(xiàn)在再次調(diào)試程序,這時(shí)會(huì)發(fā)現(xiàn)窗口只顯示了一個(gè)標(biāo)題欄,先不管它,現(xiàn)在再次調(diào)試程序,這時(shí)會(huì)發(fā)現(xiàn)窗口只

23、顯示了一個(gè)標(biāo)題欄,先不管它,繼續(xù)在繼續(xù)在Qt Creator中點(diǎn)擊中點(diǎn)擊“單步跳過(guò)單步跳過(guò)”按鈕。當(dāng)我們將程序運(yùn)行到最按鈕。當(dāng)我們將程序運(yùn)行到最后一行代碼后一行代碼return a.exec();時(shí),再次按下時(shí),再次按下“單步跳過(guò)單步跳過(guò)”按鈕后,程序按鈕后,程序窗口終于顯示出來(lái)了。這是因?yàn)橹挥谐绦蜻M(jìn)入主事件循環(huán)后才能接收窗口終于顯示出來(lái)了。這是因?yàn)橹挥谐绦蜻M(jìn)入主事件循環(huán)后才能接收事件,而事件,而show()函數(shù)會(huì)觸發(fā)顯示事件,所以只有在完成函數(shù)會(huì)觸發(fā)顯示事件,所以只有在完成a.exe()函數(shù)函數(shù)調(diào)用進(jìn)入消息循環(huán)后才能正常顯示。這次看到幾個(gè)變量的值都有了變調(diào)用進(jìn)入消息循環(huán)后才能正常顯示。這次看

24、到幾個(gè)變量的值都有了變化,但是這時(shí)還是不清楚這些值的含義?;沁@時(shí)還是不清楚這些值的含義。n注意注意:因?yàn)槭褂谜{(diào)試器進(jìn)行調(diào)試要等待一段時(shí)間,而且步驟很麻煩,:因?yàn)槭褂谜{(diào)試器進(jìn)行調(diào)試要等待一段時(shí)間,而且步驟很麻煩,對(duì)于初學(xué)者來(lái)說(shuō),如果按錯(cuò)了按鈕,還很容易出錯(cuò)。對(duì)于初學(xué)者來(lái)說(shuō),如果按錯(cuò)了按鈕,還很容易出錯(cuò)。 所以,并不推所以,并不推薦使用。薦使用。使用使用qDebugqDebug()()函數(shù)函數(shù) 一般在程序調(diào)試過(guò)程中很常用的是一般在程序調(diào)試過(guò)程中很常用的是qDebugqDebug()()函數(shù),它可以將調(diào)試信函數(shù),它可以將調(diào)試信息直接輸出到控制臺(tái),在息直接輸出到控制臺(tái),在Qt CreatorQt

25、 Creator中是輸出到應(yīng)用程序輸出欄中是輸出到應(yīng)用程序輸出欄 。例如:例如: QWidgetQWidget widget; widget; widget.resize(400, 300); / widget.resize(400, 300); / 設(shè)置窗口大小設(shè)置窗口大小 widget.move(200, 100); / widget.move(200, 100); / 設(shè)置窗口位置設(shè)置窗口位置 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方式一:直接將字符串當(dāng)做參數(shù)傳給方式一:直接將字符串當(dāng)做參數(shù)傳給qDebug()函數(shù),例如上面使用函數(shù),例如上面使用這種方法輸出這種方法輸出x和和y的值。的值。n方式二:使用輸出流的方式一次輸出多個(gè)值,它們的類型可以不同,方式二:使用輸出流的方式一次輸出多個(gè)值,它們的類型可以不同,例如程序中輸出例如程序中輸出geometry和和frame的值。的值。n需要說(shuō)明的是,如果只使用第一種方法,

28、那么是不需要添加需要說(shuō)明的是,如果只使用第一種方法,那么是不需要添加頭文件的,如果使用第二種方法就必須添加這個(gè)頭文件。頭文件的,如果使用第二種方法就必須添加這個(gè)頭文件。因?yàn)榈谝环N方法很麻煩,所以經(jīng)常使用的是第二種方法。因?yàn)榈谝环N方法很麻煩,所以經(jīng)常使用的是第二種方法。n從輸出信息中,可以清楚的看到幾個(gè)函數(shù)的含義了。從輸出信息中,可以清楚的看到幾個(gè)函數(shù)的含義了。 n其實(shí)使用其實(shí)使用qDebugqDebug()()函數(shù)的第二種方法時(shí)還可以讓輸出自動(dòng)換行,下面來(lái)看一函數(shù)的第二種方法時(shí)還可以讓輸出自動(dòng)換行,下面來(lái)看一下其他幾個(gè)函數(shù)的用法。在下其他幾個(gè)函數(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)對(duì)話框,只需在其前面使用函數(shù)也可以建立模態(tài)對(duì)話框,只需在其前面使用setModalsetModal()()函數(shù)函數(shù)即可。例如:即可。例如:QDialog QDialog * *dialog = new QDialog(thisdialog = new QDialog(this););dialog-setModal(truedialog-setModal(true););dialog-show();dialog-show();現(xiàn)在運(yùn)行程序,可以看到生成的對(duì)話框是模態(tài)的。但是,它與用現(xiàn)在運(yùn)行程序,可以看到生成的對(duì)話框是模態(tài)的。但是,它與

31、用exec()exec()函數(shù)函數(shù)時(shí)的效果是不一樣的。這是因?yàn)檎{(diào)用完時(shí)的效果是不一樣的。這是因?yàn)檎{(diào)用完show()show()函數(shù)后會(huì)立即將控制權(quán)交給調(diào)函數(shù)后會(huì)立即將控制權(quán)交給調(diào)用者,那么程序可以繼續(xù)往下執(zhí)行。而調(diào)用用者,那么程序可以繼續(xù)往下執(zhí)行。而調(diào)用exec()exec()函數(shù)卻不是這樣,它只有函數(shù)卻不是這樣,它只有當(dāng)對(duì)話框被關(guān)閉時(shí)才會(huì)返回。當(dāng)對(duì)話框被關(guān)閉時(shí)才會(huì)返回。 與與setModalsetModal()()函數(shù)相似的還有一個(gè)函數(shù)相似的還有一個(gè)setWindowModalitysetWindowModality()()函數(shù),它有一個(gè)參函數(shù),它有一個(gè)參數(shù)來(lái)設(shè)置模態(tài)對(duì)話框要阻塞的窗口類型,

32、可以是:數(shù)來(lái)設(shè)置模態(tài)對(duì)話框要阻塞的窗口類型,可以是:nQt:NonModalQt:NonModal(不阻塞任何窗口,就是非模態(tài)),(不阻塞任何窗口,就是非模態(tài)),nQt:WindowModalQt:WindowModal(阻塞它的父窗口和所有祖先窗口以及它們的子窗口),(阻塞它的父窗口和所有祖先窗口以及它們的子窗口),nQt:ApplicationModalQt:ApplicationModal(阻塞整個(gè)應(yīng)用程序的所有窗口)。(阻塞整個(gè)應(yīng)用程序的所有窗口)。 而而setModalsetModal()()函數(shù)默認(rèn)設(shè)置的是函數(shù)默認(rèn)設(shè)置的是Qt:ApplicationModalQt:Applicat

33、ionModal。多窗口切換多窗口切換 本節(jié)會(huì)涉及如下內(nèi)容:本節(jié)會(huì)涉及如下內(nèi)容:n開(kāi)始認(rèn)識(shí)信號(hào)和槽開(kāi)始認(rèn)識(shí)信號(hào)和槽n信號(hào)和槽的關(guān)聯(lián)方式信號(hào)和槽的關(guān)聯(lián)方式n從登陸對(duì)話框顯示主界面的方法從登陸對(duì)話框顯示主界面的方法開(kāi)始認(rèn)識(shí)信號(hào)和槽開(kāi)始認(rèn)識(shí)信號(hào)和槽 在在QtQt中使用信號(hào)和槽機(jī)制來(lái)完成對(duì)象之間的協(xié)同操作。中使用信號(hào)和槽機(jī)制來(lái)完成對(duì)象之間的協(xié)同操作。 簡(jiǎn)單來(lái)說(shuō),信號(hào)和槽都是函數(shù),比如按下窗口上的一個(gè)按簡(jiǎn)單來(lái)說(shuō),信號(hào)和槽都是函數(shù),比如按下窗口上的一個(gè)按鈕后想要彈出一個(gè)對(duì)話框,那么就可以將這個(gè)按鈕的單擊鈕后想要彈出一個(gè)對(duì)話框,那么就可以將這個(gè)按鈕的單擊信號(hào)和我們定義的槽關(guān)聯(lián)起來(lái),在這個(gè)槽中可以創(chuàng)建一個(gè)信號(hào)

34、和我們定義的槽關(guān)聯(lián)起來(lái),在這個(gè)槽中可以創(chuàng)建一個(gè)對(duì)話框,并且顯示它。這樣,當(dāng)單擊這個(gè)按鈕時(shí)就會(huì)發(fā)射對(duì)話框,并且顯示它。這樣,當(dāng)單擊這個(gè)按鈕時(shí)就會(huì)發(fā)射信號(hào),進(jìn)而執(zhí)行我們的槽來(lái)顯示一個(gè)對(duì)話框。信號(hào),進(jìn)而執(zhí)行我們的槽來(lái)顯示一個(gè)對(duì)話框。 關(guān)聯(lián)方式一:使用connect()關(guān)聯(lián)nmywidget.h文件寫(xiě)上槽的聲明 :public slots:void showChildDialog();n在mywidget.cpp文件中將槽的實(shí)現(xiàn) :void MyWidget:showChildDialog() QDialog *dialog = new QDialog(this); dialog-show();n在m

35、ywidget.cpp文件的MyWidget類的構(gòu)造函數(shù)中使用connect()關(guān)聯(lián)按鈕單擊信號(hào)和自定義的槽如下:connect(ui-showChildButton, SIGNAL(clicked(), this, SLOT(showChildDialog();說(shuō)明:n這里自定義了一個(gè)槽,槽必須聲明為這里自定義了一個(gè)槽,槽必須聲明為slots,這里使用了,這里使用了public slots,表明這個(gè)槽可以在類外被調(diào)用。,表明這個(gè)槽可以在類外被調(diào)用。 nclicked()信號(hào)在信號(hào)在QPushButton類中進(jìn)行了定義,而類中進(jìn)行了定義,而connect()是是QObject類中的函數(shù),因?yàn)槲?/p>

36、們的類繼承自類中的函數(shù),因?yàn)槲覀兊念惱^承自QObject,所以可以直接使用它。,所以可以直接使用它。 nconnect()函數(shù)中的四個(gè)參數(shù)分別是:發(fā)送信號(hào)的對(duì)象、函數(shù)中的四個(gè)參數(shù)分別是:發(fā)送信號(hào)的對(duì)象、發(fā)送的信號(hào)、接收信號(hào)的對(duì)象和要執(zhí)行的槽,而信號(hào)和槽發(fā)送的信號(hào)、接收信號(hào)的對(duì)象和要執(zhí)行的槽,而信號(hào)和槽要分別使用要分別使用SIGNAL()和和SLOT()宏括起來(lái)。宏括起來(lái)。 關(guān)聯(lián)方式二:在設(shè)計(jì)模式關(guān)聯(lián)n首先添加自定義對(duì)話框類首先添加自定義對(duì)話框類MyDialogMyDialog。在設(shè)計(jì)模式中向窗口上添加兩個(gè)。在設(shè)計(jì)模式中向窗口上添加兩個(gè)Push Push ButtonButton,并且分別更改其

37、顯示文本為,并且分別更改其顯示文本為“進(jìn)入主界面進(jìn)入主界面”和和“退出程序退出程序”。n點(diǎn)擊設(shè)計(jì)器上方的點(diǎn)擊設(shè)計(jì)器上方的“編輯信號(hào)編輯信號(hào)/ /槽槽”圖標(biāo),或者按下快捷鍵圖標(biāo),或者按下快捷鍵F4F4,這時(shí)便進(jìn)入了,這時(shí)便進(jìn)入了部件的信號(hào)和槽的編輯模式。在部件的信號(hào)和槽的編輯模式。在“退出程序退出程序”按鈕上按住鼠標(biāo)左鍵,然后拖按鈕上按住鼠標(biāo)左鍵,然后拖動(dòng)到窗口界面上,這時(shí)松開(kāi)鼠標(biāo)左鍵。在彈出的配置連接對(duì)話框中,選中下動(dòng)到窗口界面上,這時(shí)松開(kāi)鼠標(biāo)左鍵。在彈出的配置連接對(duì)話框中,選中下面的面的“顯示從顯示從QWidgetQWidget繼承的信號(hào)和槽繼承的信號(hào)和槽”選項(xiàng),然后在左邊的選項(xiàng),然后在左邊

38、的QPushButtonQPushButton欄欄中選擇信號(hào)中選擇信號(hào)clicked()clicked(),在右邊的,在右邊的QDialogQDialog欄中選擇對(duì)應(yīng)的槽欄中選擇對(duì)應(yīng)的槽close()close(),完成,完成后按下后按下“確定確定”。關(guān)聯(lián)方式三:自動(dòng)關(guān)聯(lián) 該按鈕上點(diǎn)擊鼠標(biāo)右鍵,在彈出的菜單上選擇該按鈕上點(diǎn)擊鼠標(biāo)右鍵,在彈出的菜單上選擇“轉(zhuǎn)到槽轉(zhuǎn)到槽”,然后在彈出的對(duì),然后在彈出的對(duì)話框中選擇話框中選擇clicked()clicked()信號(hào),并按信號(hào),并按“確定確定”。這時(shí)便會(huì)進(jìn)入代碼編輯模式,。這時(shí)便會(huì)進(jìn)入代碼編輯模式,并且定位到自動(dòng)生成的并且定位到自動(dòng)生成的on_push

39、Button_clickedon_pushButton_clicked()()槽中。在其中添加代碼:槽中。在其中添加代碼:void MyDialog:on_pushButton_clickedvoid MyDialog:on_pushButton_clicked()() acceptaccept(); (); n自動(dòng)關(guān)聯(lián)就是將關(guān)聯(lián)函數(shù)整合到槽命名中,但必須使用自動(dòng)關(guān)聯(lián)就是將關(guān)聯(lián)函數(shù)整合到槽命名中,但必須使用Qt部件已經(jīng)提部件已經(jīng)提供的信號(hào)。供的信號(hào)。n例如例如on_pushButton_clicked()就是由字符就是由字符“on”和發(fā)射信號(hào)的部件和發(fā)射信號(hào)的部件對(duì)象名,還有信號(hào)名組成。這樣就

40、可以去掉那個(gè)對(duì)象名,還有信號(hào)名組成。這樣就可以去掉那個(gè)connect()關(guān)聯(lián)函數(shù)關(guān)聯(lián)函數(shù)了。每當(dāng)了。每當(dāng)pushButton被按下,就好發(fā)射被按下,就好發(fā)射clicked()信號(hào),然后就會(huì)執(zhí)信號(hào),然后就會(huì)執(zhí)行行on_pushButton_clicked()槽。槽。n這里這里accept()函數(shù)是函數(shù)是QDialog類中的一個(gè)槽,對(duì)于一個(gè)使用類中的一個(gè)槽,對(duì)于一個(gè)使用exec()函函數(shù)實(shí)現(xiàn)的模態(tài)對(duì)話框,執(zhí)行了這個(gè)槽,就會(huì)隱藏這個(gè)模態(tài)對(duì)話框,并數(shù)實(shí)現(xiàn)的模態(tài)對(duì)話框,執(zhí)行了這個(gè)槽,就會(huì)隱藏這個(gè)模態(tài)對(duì)話框,并返回返回QDialog:Accepted值,我們就是要使用這個(gè)值來(lái)判斷是哪個(gè)按值,我們就是要使用

41、這個(gè)值來(lái)判斷是哪個(gè)按鈕被按下了。與其對(duì)應(yīng)的還有一個(gè)鈕被按下了。與其對(duì)應(yīng)的還有一個(gè)reject()槽,它可以返回一個(gè)槽,它可以返回一個(gè)QDialog:Rejected值。其實(shí),前面的值。其實(shí),前面的“退出程序退出程序”按鈕也可以關(guān)聯(lián)按鈕也可以關(guān)聯(lián)這個(gè)槽。這個(gè)槽。使用自定義對(duì)話框登陸主界面使用自定義對(duì)話框登陸主界面在在main()函數(shù)中:函數(shù)中: QApplication a(argc, argv); MyWidget w; MyDialog dialog; / 新建新建MyDialog類對(duì)象類對(duì)象 if(dialog.exec()=QDialog:Accepted) / 判斷判斷dialog執(zhí)行

42、結(jié)果執(zhí)行結(jié)果 w.show(); / 如果是按下了如果是按下了“進(jìn)入主界面進(jìn)入主界面”按鈕,則顯示主界面按鈕,則顯示主界面 return a.exec(); / 程序正常運(yùn)行程序正常運(yùn)行 else return 0; 在主函數(shù)中建立了在主函數(shù)中建立了MyDialog對(duì)象,然后判斷其對(duì)象,然后判斷其exec()函數(shù)的返回值,如果是函數(shù)的返回值,如果是按下了按下了“進(jìn)入主界面進(jìn)入主界面”按鈕,那么返回值應(yīng)該是按鈕,那么返回值應(yīng)該是QDialog:Accepted,就顯,就顯示主界面,并且正常執(zhí)行程序。如果不是,則直接退出程序。示主界面,并且正常執(zhí)行程序。如果不是,則直接退出程序。標(biāo)準(zhǔn)對(duì)話框標(biāo)準(zhǔn)對(duì)話

43、框 Qt Qt提供了一些常用的對(duì)話框類型,它們?nèi)坷^承自提供了一些常用的對(duì)話框類型,它們?nèi)坷^承自QDialogQDialog類,并增加了自類,并增加了自己的特色功能,比如獲取顏色、顯示特定信息等。己的特色功能,比如獲取顏色、顯示特定信息等。 n顏色對(duì)話框顏色對(duì)話框 n文件對(duì)話框文件對(duì)話框 n字體對(duì)話框字體對(duì)話框 n輸入對(duì)話框輸入對(duì)話框 n消息對(duì)話框消息對(duì)話框 n進(jìn)度對(duì)話框進(jìn)度對(duì)話框 n錯(cuò)誤信息對(duì)話框錯(cuò)誤信息對(duì)話框 n向?qū)?duì)話框向?qū)?duì)話框 顏色對(duì)話框例如:例如:QColor color = QColorDialog:getColor(Qt:red, this, trQColor color =

44、 QColorDialog:getColor(Qt:red, this, tr(顏色對(duì)話框顏色對(duì)話框););qDebugqDebug() color: color;() color: color; 這里使用了這里使用了QColorDialog的靜態(tài)函數(shù)的靜態(tài)函數(shù)getColor()來(lái)獲取顏色,它的三個(gè)參數(shù)來(lái)獲取顏色,它的三個(gè)參數(shù)的作用分別是:設(shè)置初始顏色、父窗口和對(duì)話框標(biāo)題。這里的的作用分別是:設(shè)置初始顏色、父窗口和對(duì)話框標(biāo)題。這里的Qt:red,是,是Qt預(yù)定義的顏色對(duì)象。預(yù)定義的顏色對(duì)象。n如果想要更靈活的設(shè)置時(shí),可以先創(chuàng)建對(duì)象,然后進(jìn)行各項(xiàng)設(shè)置:如果想要更靈活的設(shè)置時(shí),可以先創(chuàng)建對(duì)象,然

45、后進(jìn)行各項(xiàng)設(shè)置:void MyWidget:on_pushButton_clicked() QColorDialog dialog(Qt:red,this); / 創(chuàng)建對(duì)象創(chuàng)建對(duì)象 dialog.setOption(QColorDialog:ShowAlphaChannel); / 顯示顯示alpha選項(xiàng)選項(xiàng) dialog.exec(); / 以模態(tài)方式運(yùn)行對(duì)話框以模態(tài)方式運(yùn)行對(duì)話框 QColor color = dialog.currentColor(); / 獲取當(dāng)前顏色獲取當(dāng)前顏色 qDebug()color:label-setPixmap(QPixmap(F:/logo.pngui-l

46、abel-setPixmap(QPixmap(F:/logo.png););n還可以顯示還可以顯示gifgif動(dòng)態(tài)圖片:動(dòng)態(tài)圖片:QMovie QMovie * *movie = new QMovie(F:/donghua.gifmovie = new QMovie(F:/donghua.gif););ui-label-setMovie(movieui-label-setMovie(movie); / ); / 在標(biāo)簽中添加動(dòng)畫(huà)在標(biāo)簽中添加動(dòng)畫(huà)movie-start(); movie-start(); 按鈕部件按鈕部件 QAbstractButton類是按鈕部件的抽象基類,提供了按鈕類是按鈕部

47、件的抽象基類,提供了按鈕的通用功能。它的子類包括:的通用功能。它的子類包括:n復(fù)選框復(fù)選框QCheckBoxn標(biāo)準(zhǔn)按鈕標(biāo)準(zhǔn)按鈕QPushButtonn單選框按鈕單選框按鈕QRadioButtonn工具按鈕工具按鈕QToolButton。 例:例:QPushButton 在下面代碼里為三個(gè)按鈕改變了顯示文本,這里在一個(gè)字母前加上在下面代碼里為三個(gè)按鈕改變了顯示文本,這里在一個(gè)字母前加上“&”&”符符號(hào),那么就可以將這個(gè)按鈕的加速鍵設(shè)置為號(hào),那么就可以將這個(gè)按鈕的加速鍵設(shè)置為AltAlt加上這個(gè)字母。如果我們要在加上這個(gè)字母。如果我們要在文本中顯示文本中顯示“&”&

48、”符號(hào)本身,那么可以使用符號(hào)本身,那么可以使用“&”&”。我們也可以使用。我們也可以使用setIconsetIcon()()函數(shù)來(lái)給按鈕添加圖標(biāo),這里圖片文件使用了相對(duì)路徑(當(dāng)然這函數(shù)來(lái)給按鈕添加圖標(biāo),這里圖片文件使用了相對(duì)路徑(當(dāng)然這個(gè)也可以在設(shè)計(jì)模式通過(guò)更改個(gè)也可以在設(shè)計(jì)模式通過(guò)更改iconicon屬性來(lái)實(shí)現(xiàn))。對(duì)于屬性來(lái)實(shí)現(xiàn))。對(duì)于pushBtn3pushBtn3,我們?yōu)槠?,我們?yōu)槠涮砑恿讼吕藛?,?dāng)然,現(xiàn)在這個(gè)菜單什么功能也沒(méi)實(shí)現(xiàn)。添加了下拉菜單,當(dāng)然,現(xiàn)在這個(gè)菜單什么功能也沒(méi)實(shí)現(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部件是一個(gè)單行的文本編輯器,它允許用戶輸入和編輯單行的純文本內(nèi)容,而且提供了一系列有用的功能,包括撤銷與恢復(fù)、剪切和拖放等操作。 例如:n顯示模式顯示模式 n輸入掩碼輸入掩碼 n輸入驗(yàn)證

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論