第5講 Qt窗口部件_第1頁(yè)
第5講 Qt窗口部件_第2頁(yè)
第5講 Qt窗口部件_第3頁(yè)
第5講 Qt窗口部件_第4頁(yè)
第5講 Qt窗口部件_第5頁(yè)
已閱讀5頁(yè),還剩46頁(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、1第第3 3章章 窗口部件窗口部件n3.1 基礎(chǔ)窗口部件基礎(chǔ)窗口部件QWidgetn3.2 對(duì)話框?qū)υ捒騋Dialogn3.3 其他窗口部件其他窗口部件n3.4 小結(jié)小結(jié)2 前一章中第一次建立前一章中第一次建立helloworldhelloworld程序時(shí),曾看到程序時(shí),曾看到Qt CreatorQt Creator提供的默認(rèn)基類提供的默認(rèn)基類只有只有QMainWindowQMainWindow、QWidgetQWidget和和QDialogQDialog三種。三種。1 1)QMainWindowQMainWindow是帶有菜單欄和工具欄的主窗口類,是帶有菜單欄和工具欄的主窗口類,2) 2)

2、QDialogQDialog是各種對(duì)話框的基類,而它們二者全部繼承自是各種對(duì)話框的基類,而它們二者全部繼承自QWidgetQWidget。不僅如。不僅如此,其實(shí)所有的窗口部件都繼承自此,其實(shí)所有的窗口部件都繼承自QWidgetQWidget。33.1 基礎(chǔ)窗口部件基礎(chǔ)窗口部件QWidgetnQWidgetQWidget類是所有用戶界面對(duì)象的基類,被稱為基礎(chǔ)窗口類是所有用戶界面對(duì)象的基類,被稱為基礎(chǔ)窗口部件。部件。QWidgetQWidget繼承自繼承自QObjectQObject類和類和QPaintDeviceQPaintDevice類類。 QObjectQObject是所有支持是所有支持Qt

3、Qt對(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)試 4窗口、子部件以及窗口類型窗口、子部件以及窗口類型 / 新建新建QWidget類對(duì)象,默認(rèn)類對(duì)象,默認(rèn)parent參數(shù)是參數(shù)是0,所以它是個(gè)窗口,所以它是個(gè)窗口 QWidget *widget = new QWidget(); / 設(shè)置窗口標(biāo)題設(shè)置窗口標(biāo)題

4、 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(QObject:tr(label:我是個(gè)窗口我是個(gè)窗口); / 改變部件大小,以便能顯示出完整的內(nèi)容改變部件大小,以便能顯示出完整的內(nèi)容 label-resize(180, 20); /

5、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(); widget-show();5n在程序中定義了一個(gè)在程序中定義了一個(gè)QWidget類對(duì)象的指針類對(duì)象的指針widget和兩個(gè)和兩個(gè)QLabel對(duì)象指針對(duì)象指針label與與label2,其中

6、,其中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)有嵌入到其他部件中的部件稱為中,把沒(méi)有嵌入到其他部件中的部件稱為窗口窗口,一般的,窗口都,一般的,窗口都有邊框和標(biāo)題欄,就像程序中的有邊框和標(biāo)題欄,就像程序中的widget和和label一樣。

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

8、的:nQWidgetQWidget的構(gòu)造函數(shù)有兩個(gè)參數(shù):的構(gòu)造函數(shù)有兩個(gè)參數(shù):QWidget QWidget * * parent = 0 parent = 0和和Qt:WindowFlags f = 0Qt:WindowFlags f = 0; 前面的前面的parentparent就是指父窗口部件,默認(rèn)值為就是指父窗口部件,默認(rèn)值為0 0,表明沒(méi)有父窗口;,表明沒(méi)有父窗口; 而后面的而后面的f f參數(shù)是參數(shù)是Qt:WindowFlagsQt:WindowFlags類型的,它是一個(gè)枚舉類型,分為類型的,它是一個(gè)枚舉類型,分為窗口類型(窗口類型(WindowTypeWindowType)和窗口標(biāo)

9、志()和窗口標(biāo)志(WindowFlagsWindowFlags。前者可以定義。前者可以定義窗口的類型,比如我們這里窗口的類型,比如我們這里f=0f=0,表明使用了,表明使用了Qt:WidgetQt:Widget一項(xiàng),這是一項(xiàng),這是QWidgetQWidget的默認(rèn)類型,這種類型的部件如果有父窗口,那么它就是子的默認(rèn)類型,這種類型的部件如果有父窗口,那么它就是子部件,否則就是獨(dú)立的窗口。部件,否則就是獨(dú)立的窗口。7 例如:使用其中的例如:使用其中的Qt:Dialog和和Qt:SplashScreen,更改程序中的新建對(duì)象,更改程序中的新建對(duì)象的那兩行代碼:的那兩行代碼:QWidget *widg

10、et = new QWidget(0, Qt:Dialog);QLabel *label = new QLabel(0, Qt:SplashScreen); 更改后,窗口的樣式發(fā)生了改變,一個(gè)是對(duì)話框類型,一個(gè)是歡迎窗口類型。更改后,窗口的樣式發(fā)生了改變,一個(gè)是對(duì)話框類型,一個(gè)是歡迎窗口類型。 再次更改那兩行代碼:再次更改那兩行代碼:QWidget *widget = new QWidget(0, Qt:Dialog | Qt:FramelessWindowHint);QLabel *label = new QLabel(0, Qt:SplashScreen | Qt:WindowStaysO

11、nTopHint);Qt:FramelessWindowHint用來(lái)產(chǎn)生一個(gè)沒(méi)有邊框的窗口用來(lái)產(chǎn)生一個(gè)沒(méi)有邊框的窗口Qt:WindowStaysOnTopHint用來(lái)使該窗口停留在所有其它窗口上面。用來(lái)使該窗口停留在所有其它窗口上面。8窗口幾何布局 對(duì)于窗口的大小和位置,根據(jù)是否包含邊框和標(biāo)題欄兩種情況,要用不同的函數(shù)來(lái)獲對(duì)于窗口的大小和位置,根據(jù)是否包含邊框和標(biāo)題欄兩種情況,要用不同的函數(shù)來(lái)獲取它們的數(shù)值。取它們的數(shù)值。 這里的函數(shù)分為兩類,一類是包含框架的,一類是不包含框架的:這里的函數(shù)分為兩類,一類是包含框架的,一類是不包含框架的:n包含框架:包含框架:x()、y()、frameGeom

12、etry()、pos()和和move()等函數(shù);等函數(shù);n不包含框架:不包含框架:geometry()、width()、height()、rect()和和size()等函數(shù)。等函數(shù)。9程序調(diào)試程序調(diào)試下面在講解窗口幾何布局的幾個(gè)函數(shù)的同時(shí),講解一下程序調(diào)試方面的內(nèi)容。 將主函數(shù)內(nèi)容更改如下:將主函數(shù)內(nèi)容更改如下:#include #include #include #include int main(int argc, char int main(int argc, char * *argv)argv) QApplication a(argc, argv); QApplication a(ar

13、gc, argv); QWidget widget; QWidget widget; int x = widget.x(); int x = widget.x(); int 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.exe

14、c(); x()x()、y()y()分別返回部件的位置坐標(biāo)的分別返回部件的位置坐標(biāo)的x x、y y值,它們的默認(rèn)值為值,它們的默認(rèn)值為0 0。而而geometry()geometry()和和frameGeometry()frameGeometry()函函數(shù)分別返回沒(méi)有邊框和包含邊框的窗數(shù)分別返回沒(méi)有邊框和包含邊框的窗口框架矩形的值,其返回值是口框架矩形的值,其返回值是QRectQRect類型的,就是一個(gè)矩形,它的形式是類型的,就是一個(gè)矩形,它的形式是(位置坐標(biāo),大小信息),也就是(位置坐標(biāo),大小信息),也就是(x x,y y,寬,高)。,寬,高)。10 下面在下面在int x = widget

15、.x(); int 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)行到該行代碼時(shí)會(huì)暫停下來(lái),從而,就是程序運(yùn)行到該行代碼時(shí)會(huì)暫停下來(lái),從而可以查看一些信息,如變量值等。可以查看一些信息,如變量值等。 要取消斷點(diǎn),只要在那個(gè)斷點(diǎn)上再點(diǎn)擊一下就可以了。設(shè)要取消斷點(diǎn),只要在那個(gè)斷點(diǎn)上再點(diǎn)擊一下就可以了。設(shè)置好斷點(diǎn)后便可以按下置好斷點(diǎn)后便可以按下F5F5或者左下角的調(diào)試按鈕開(kāi)始調(diào)試?;蛘咦笙陆堑恼{(diào)試按鈕開(kāi)始調(diào)試。 在程序構(gòu)建時(shí)可能會(huì)出現(xiàn)警告,那是因?yàn)槲覀兌x了變量在程序構(gòu)建時(shí)可能會(huì)出現(xiàn)警告,那是因?yàn)槲覀?/p>

16、定義了變量卻沒(méi)有使用造成的,不用管它。卻沒(méi)有使用造成的,不用管它。 11調(diào)試模式12下面對(duì)調(diào)試模式的幾個(gè)按鈕和窗口進(jìn)行簡(jiǎn)單介紹:下面對(duì)調(diào)試模式的幾個(gè)按鈕和窗口進(jìn)行簡(jiǎn)單介紹:繼續(xù)按鈕。程序在斷點(diǎn)處停了下來(lái),按下繼續(xù)按鈕后,程繼續(xù)按鈕。程序在斷點(diǎn)處停了下來(lái),按下繼續(xù)按鈕后,程序便會(huì)像正常運(yùn)行一樣,執(zhí)行后面的代碼,直到遇到下一序便會(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)入

17、按鈕。進(jìn)入調(diào)用的函數(shù)內(nèi)部。單步進(jìn)入按鈕。進(jìn)入調(diào)用的函數(shù)內(nèi)部。單步跳出按鈕。當(dāng)進(jìn)入函數(shù)內(nèi)部時(shí),跳出該函數(shù),一般與單步跳出按鈕。當(dāng)進(jìn)入函數(shù)內(nèi)部時(shí),跳出該函數(shù),一般與單步進(jìn)入配合使用。單步進(jìn)入配合使用。13n從變量監(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+0640 x480+0+0,fram

18、eframe的值為的值為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注意:注意:widget.show();不能加在不能加在widget.frameGeometry()widget.frameGeo

19、metry()之后,否則之后,否則值還是不變。值還是不變。程序調(diào)試程序調(diào)試14使用使用qDebug()qDebug()函數(shù)函數(shù) 一在程序調(diào)試過(guò)程中一在程序調(diào)試過(guò)程中也也常用常用qDebug()qDebug()函數(shù),它可以將調(diào)試信息直接函數(shù),它可以將調(diào)試信息直接輸出到控制臺(tái),在輸出到控制臺(tái),在Qt CreatorQt Creator中是輸出到應(yīng)用程序輸出欄中是輸出到應(yīng)用程序輸出欄 。例如:。例如: QWidget widget; QWidget widget; widget.resize(400, 300); / widget.resize(400, 300); / 設(shè)置窗口大小設(shè)置窗口大小 w

20、idget.move(200, 100); / widget.move(200, 100); / 設(shè)置窗口位置設(shè)置窗口位置 widget.show(); widget.show(); int x = widget.x(); int x = widget.x(); qDebug(x: %d, x); / qDebug(x: %d, x); / 輸出輸出x x的值的值 int y = widget.y(); int y = widget.y(); qDebug(y: %d, y); qDebug(y: %d, y); QRect geometry = widget.geometry(); QRec

21、t geometry = widget.geometry(); QRect frame = widget.frameGeometry(); QRect frame = widget.frameGeometry(); qDebug() geometry: geometry frame: frame; qDebug() geometry: geometry frame: frame;15 這里使用了兩種輸出方式:這里使用了兩種輸出方式:n方式一:直接將字符串當(dāng)做參數(shù)傳給方式一:直接將字符串當(dāng)做參數(shù)傳給qDebug()函數(shù),例如上面使用函數(shù),例如上面使用這種方法輸出這種方法輸出x和和y的值的值(不需

22、要不需要頭文件頭文件)。n方式二:使用輸出流的方式一次輸出多個(gè)值,它們的類型可以不同,方式二:使用輸出流的方式一次輸出多個(gè)值,它們的類型可以不同,例如程序中輸出例如程序中輸出geometry和和frame的值的值(需要需要頭文件頭文件)。n說(shuō)明說(shuō)明:因?yàn)榈谝环N方法很麻煩,所以因?yàn)榈谝环N方法很麻煩,所以經(jīng)常使用的是第二種方法經(jīng)常使用的是第二種方法。n從輸出信息中,可以清楚的看到幾個(gè)函數(shù)的含義了。從輸出信息中,可以清楚的看到幾個(gè)函數(shù)的含義了。 16nqDebug()qDebug()函數(shù)的第二種方法時(shí)還可以讓輸出自動(dòng)換行。在函數(shù)的第二種方法時(shí)還可以讓輸出自動(dòng)換行。在return a.exec();r

23、eturn a.exec();一行代碼前添加如下代碼:一行代碼前添加如下代碼:qDebug() pos: widget.pos() endl rect: widget.rect()qDebug() pos: widget.pos() endl rect: widget.rect() endl size: widget.size() endl width: endl size: widget.size() endl width: widget.width() endl height: widget.height(); widget.width() endl height: show();n在my

24、widget.cpp文件的MyWidget類的構(gòu)造函數(shù)中使用connect()關(guān)聯(lián)按鈕單擊信號(hào)和自定義的槽如下:connect(ui-showChildButton, SIGNAL(clicked(), this, SLOT(showChildDialog();23說(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>

25、我們的類繼承自類中的函數(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)。 24模態(tài)和非模態(tài)對(duì)話框模態(tài)和非模態(tài)對(duì)話框n模態(tài)模態(tài)對(duì)話框就是在我們沒(méi)有關(guān)閉它之前,不能再與同一個(gè)應(yīng)用程序的其他窗對(duì)話框就是在我們沒(méi)有關(guān)閉它之前,不能再與同一個(gè)應(yīng)用程序的其他窗口進(jìn)行交互,比如新建項(xiàng)目時(shí)彈出的對(duì)話框。要想使一

26、個(gè)對(duì)話框成為模態(tài)對(duì)口進(jìn)行交互,比如新建項(xiàng)目時(shí)彈出的對(duì)話框。要想使一個(gè)對(duì)話框成為模態(tài)對(duì)話框,只需要調(diào)用它的話框,只需要調(diào)用它的exec()exec()函數(shù):函數(shù):QDialog dialog(this);QDialog dialog(this);dialog.exec();dialog.exec();n而對(duì)于而對(duì)于非模態(tài)非模態(tài)對(duì)話框,既可以與它交互,也可以與同一程序中的其他窗口交對(duì)話框,既可以與它交互,也可以與同一程序中的其他窗口交互,例如互,例如Microsoft WordMicrosoft Word中的查找替換對(duì)話框。要使一個(gè)對(duì)話框成為非模態(tài)中的查找替換對(duì)話框。要使一個(gè)對(duì)話框成為非模態(tài)對(duì)話框

27、,我們就可以使用對(duì)話框,我們就可以使用newnew操作來(lái)創(chuàng)建,然后使用操作來(lái)創(chuàng)建,然后使用show()show()函數(shù)來(lái)顯示。函數(shù)來(lái)顯示。 QDialog QDialog * *dialog = new QDialog(this);dialog = new QDialog(this);dialog-show();dialog-show();25 使用使用show()show()函數(shù)也可以建立模態(tài)對(duì)話框,只需在其前面使用函數(shù)也可以建立模態(tài)對(duì)話框,只需在其前面使用setModal()setModal()函數(shù)函數(shù)即可。例如:即可。例如:QDialog QDialog * *dialog = new

28、QDialog(this);dialog = new QDialog(this);dialog-setModal(true);dialog-setModal(true);dialog-show();dialog-show();現(xiàn)在運(yùn)行程序,可以看到生成的對(duì)話框是模態(tài)的。但是,它與用現(xiàn)在運(yùn)行程序,可以看到生成的對(duì)話框是模態(tài)的。但是,它與用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(

29、)exec()函數(shù)卻不是這樣,它只有函數(shù)卻不是這樣,它只有當(dāng)對(duì)話框被關(guān)閉時(shí)才會(huì)返回。當(dāng)對(duì)話框被關(guān)閉時(shí)才會(huì)返回。 與與setModal()setModal()函數(shù)相似的還有一個(gè)函數(shù)相似的還有一個(gè)setWindowModality()setWindowModality()函數(shù),它有一個(gè)參函數(shù),它有一個(gè)參數(shù)來(lái)設(shè)置模態(tài)對(duì)話框要阻塞的窗口類型,可以是:數(shù)來(lái)設(shè)置模態(tài)對(duì)話框要阻塞的窗口類型,可以是:nQt:NonModalQt:NonModal(不阻塞任何窗口,就是非模態(tài)),(不阻塞任何窗口,就是非模態(tài)),nQt:WindowModalQt:WindowModal(阻塞它的父窗口和所有祖先窗口以及它們的子窗

30、口),(阻塞它的父窗口和所有祖先窗口以及它們的子窗口),nQt:ApplicationModalQt:ApplicationModal(阻塞整個(gè)應(yīng)用程序的所有窗口)。(阻塞整個(gè)應(yīng)用程序的所有窗口)。 而而setModal()setModal()函數(shù)默認(rèn)設(shè)置的是函數(shù)默認(rèn)設(shè)置的是Qt:ApplicationModalQt:ApplicationModal。26標(biāo)準(zhǔn)對(duì)話框標(biāo)準(zhǔn)對(duì)話框 Qt Qt提供了一些常用的對(duì)話框類型,它們?nèi)坷^承自提供了一些常用的對(duì)話框類型,它們?nèi)坷^承自QDialogQDialog類,并增加了自類,并增加了自己的特色功能,比如獲取顏色、顯示特定信息等。己的特色功能,比如獲取顏色

31、、顯示特定信息等。 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ì)話框 27標(biāo)準(zhǔn)對(duì)話框:28標(biāo)準(zhǔn)文件對(duì)話框getOpenFileName()函數(shù)返回用戶選擇的文件名。但是當(dāng)用戶在選擇文件時(shí),如果選擇“取消”(Cancel),則返回一個(gè)空串。在此只詳細(xì)說(shuō)明getOpenFileName()靜態(tài)函數(shù)各個(gè)參數(shù)的作用,其他文件對(duì)話框類中相關(guān)的靜態(tài)函數(shù)的參數(shù)有與其類似之處。其函數(shù)形式如下:QString QFileDialog:getOpenFileName

32、(QWidget* parent=0, /標(biāo)準(zhǔn)文件對(duì)話框的父窗口const QString & caption=QString(),/標(biāo)準(zhǔn)文件對(duì)話框的標(biāo)題名const QString & dir=QString(), /注(1)const QString & filter=QString(),/注(2)QString * selectedFilter=0, /用戶選擇的過(guò)濾器通過(guò)此參數(shù)返回Options options=0 /選擇顯示文件名的格式,默認(rèn)是同時(shí)顯示目錄與文件名)29 QString s = QFileDialog:getOpenFileName(this,

33、open file dialog,/, C+ files(*.cpp):C files(*.c):Head files(*.h); fileLineEdit-setText(s);添加頭文件:#include標(biāo)準(zhǔn)文件對(duì)話框30顏色對(duì)話框例如:例如:QColor color = QColorDialog:getColor(Qt:red, this, tr(QColor color = QColorDialog:getColor(Qt:red, this, tr(顏色對(duì)話框顏色對(duì)話框););qDebug() color: color;qDebug() color: color; 這里使用了這里使用

34、了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ì)象,然后進(jìn)行各項(xiàng)設(shè)置:void MyWidget:on_pushButton_clicked() QColorDialog dialog(Qt:red,this); / 創(chuàng)建對(duì)象創(chuàng)建對(duì)象 dialog.setOption(

35、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:setFont(f); 32自學(xué)內(nèi)容: 自學(xué)其他標(biāo)準(zhǔn)對(duì)話框的使用。33程序啟動(dòng)畫面(QSplashScreen)當(dāng)運(yùn)行程序時(shí),在顯示屏的中央出現(xiàn)一個(gè)啟動(dòng)畫面,經(jīng)過(guò)一段時(shí)間,應(yīng)用程序完成初始化工作后,啟動(dòng)畫面隱去,出現(xiàn)程序的主窗口界面。(4) 啟動(dòng)畫面主要在main()函數(shù)中實(shí)現(xiàn),添加以下加黑代

36、碼:#include #include int main(int argc, char *argv) QApplication a(argc, argv); QPixmap pixmap(:/res/myShow.jpg); QSplashScreen splash(pixmap); splash.show(); cessEvents(); MainWindow w; w.show(); splash.finish(&w); return a.exec();342021-9-3下面通過(guò)實(shí)現(xiàn)類似QQ抽屜效果來(lái)介紹QToolBox類的使用,QToolBox提供了一種列狀的層疊窗體

37、,而QToolButton提供了一種快速訪問(wèn)命令或選擇項(xiàng)的按鈕,通常在工具條中使用。運(yùn)行效果如圖所示。 QToolBox類352021-9-3(1) 建立一個(gè)空工程。單擊“File”-“New File or Project.”,在彈出的對(duì)話框中選擇Projects組下的“Empty Qt4 Project”,單擊“OK”按鈕。(2) 在彈出的對(duì)話框中對(duì)該工程進(jìn)行命名并選擇保存的路徑,這里命名為 “MyQQExample”。單擊“Next”按鈕,最后單擊“Finish”按鈕,完成該文件工程的建立。(3) 下面添加該工程的提供主要顯示界面的函數(shù)所在的文件,在“MyQQExample”項(xiàng)目名上單擊

38、鼠標(biāo)右鍵,在彈出的快捷菜單中選擇“Add New.”菜單項(xiàng),在彈出的對(duì)話框中選擇“C+ Class”選項(xiàng)。單擊“OK”按鈕,彈出“C+ Class Wizard”對(duì)話框,在Base class后面的下拉列表框中輸入基類名“QToolBox”(手工添加),在Class name后面的文本框中輸入類的名稱“Drawer”。(4) 單擊“Next”按鈕,單擊“Finish”按鈕,添加drawer.h頭文件和drawer.cpp源文件。創(chuàng)建步驟362021-9-3(4) Drawer類繼承自QToolBox類,打開(kāi)“drawer.h”頭文件,定義實(shí)例中需要用到的各種窗體控件。具體代碼如下:#inclu

39、de #include class Drawer : public QToolBoxQ_OBJECT public:Drawer(QWidget *parent=0,Qt:WindowFlags f=0); private:QToolButton *toolBtn1_1;QToolButton *toolBtn1_2;QToolButton *toolBtn1_3;QToolButton *toolBtn1_4;QToolButton *toolBtn1_4;QToolButton *toolBtn2_1;QToolButton *toolBtn2_2;QToolButton *toolBtn

40、3_1;QToolButton *toolBtn3_2;創(chuàng)建步驟372021-9-3(6) 打開(kāi)“drawer.cpp”文件,添加代碼。(7) 在“drawer.cpp”文件一開(kāi)始加入以下頭文件:#include #include (8) 下面添加該工程的入口函數(shù)所在的文件(main.cpp文件),在“MyQQExample”項(xiàng)目名上單擊鼠標(biāo)右鍵,在彈出的快捷菜單中選擇“Add New.”菜單項(xiàng),在彈出的對(duì)話框中選擇“C+ Source File”選項(xiàng),單擊“OK”按鈕,彈出“New C+ Source File”對(duì)話框,在name后面的文本框中輸入“main.cpp”。單擊“Next”按鈕,

41、單擊“Finish”按鈕,添加main函數(shù)。創(chuàng)建步驟382021-9-3(9) 打開(kāi)“main.cpp”文件,添加以下代碼:#include #include drawer.h#include int main(int argc, char *argv) QApplication a(argc, argv); QTextCodec:setCodecForTr(QTextCodec:codecForLocale(); /顯示中文 Drawer drawer; drawer.show(); return a.exec();(10) 編譯運(yùn)行此程序,此時(shí)未看到加載的圖片,是因?yàn)閳D片放置的路徑不是默認(rèn)

42、的,只要將所用到的圖片放置到該工程下的debug文件夾下即可。最后運(yùn)行一下程序,顯示效果如圖所示。創(chuàng)建步驟393.3 其他窗口部件其他窗口部件QtQt提供了一些常用的窗口部件:提供了一些常用的窗口部件:nQFrameQFrame類族類族 n按鈕部件按鈕部件 n行編輯器行編輯器n數(shù)值設(shè)定框數(shù)值設(shè)定框n滑塊部件滑塊部件40QFrameQFrame類族類族 nQFrameQFrame類是帶有邊框的部件的基類。它的子類有我們最為常用的標(biāo)簽類是帶有邊框的部件的基類。它的子類有我們最為常用的標(biāo)簽部件部件QLabelQLabel,另外還有,另外還有QLCDNumberQLCDNumber、QSplitter

43、QSplitter、QStackedWidgetQStackedWidget、QToolBoxQToolBox和和QAbstractScrollAreaQAbstractScrollArea類。類。 n帶邊框部件最主要的特點(diǎn)就是可以有一個(gè)明顯的邊界框架。帶邊框部件最主要的特點(diǎn)就是可以有一個(gè)明顯的邊界框架。QFrameQFrame類類的主要功能也就是用來(lái)實(shí)現(xiàn)不同的邊框效果,這主要是由邊框形狀的主要功能也就是用來(lái)實(shí)現(xiàn)不同的邊框效果,這主要是由邊框形狀(ShapeShape)和邊框陰影()和邊框陰影(ShadowShadow)組合來(lái)形成的。)組合來(lái)形成的。 41例:例:QLabel n除了最常用的顯

44、示文本外,還可以顯示圖片:除了最常用的顯示文本外,還可以顯示圖片:ui-label-setPixmap(QPixmap(F:/logo.png);ui-label-setPixmap(QPixmap(F:/logo.png);n還可以顯示還可以顯示gifgif動(dòng)態(tài)圖片:動(dòng)態(tài)圖片:QMovie QMovie * *movie = new QMovie(F:/donghua.gif);movie = new QMovie(F:/donghua.gif);ui-label-setMovie(movie); / ui-label-setMovie(movie); / 在標(biāo)簽中添加動(dòng)畫在標(biāo)簽中添加動(dòng)畫m

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

46、么就可以將這個(gè)按鈕的加速鍵設(shè)置為AltAlt加加上這個(gè)字母。如果我們要在文本中顯示上這個(gè)字母。如果我們要在文本中顯示“&”&”符號(hào)本身,那么可以使用符號(hào)本身,那么可以使用“&”&” 可以使用可以使用setIcon()setIcon()函數(shù)來(lái)給按鈕添加圖標(biāo),這里圖片文件使用了相對(duì)路徑函數(shù)來(lái)給按鈕添加圖標(biāo),這里圖片文件使用了相對(duì)路徑(當(dāng)然這個(gè)也可以在設(shè)計(jì)模式通過(guò)更改(當(dāng)然這個(gè)也可以在設(shè)計(jì)模式通過(guò)更改iconicon屬性來(lái)實(shí)現(xiàn))。對(duì)于屬性來(lái)實(shí)現(xiàn))。對(duì)于pushBtn3pushBtn3,為其添加了下拉菜單。為其添加了下拉菜單。ui-pushBtn1-setText(tr

47、(&nihao); / ui-pushBtn1-setText(tr(&nihao); / 這樣便指定了這樣便指定了Alt+NAlt+N為加速鍵為加速鍵ui-pushBtn2-setText(tr(ui-pushBtn2-setText(tr(幫助幫助(&H);(&H);ui-pushBtn2-setIcon(QIcon(./image/help.png);ui-pushBtn2-setIcon(QIcon(./image/help.png);ui-pushBtn3-setText(tr(z&oom);ui-pushBtn3-setText(tr(z&a

48、mp;oom);QMenu QMenu * *menu = new QMenu(this);menu = new QMenu(this);menu-addAction(QIcon(./image/zoom-in.png), tr(menu-addAction(QIcon(./image/zoom-in.png), tr(放大放大););ui-pushBtn3-setMenu(menu);ui-pushBtn3-setMenu(menu); 44行編輯器行編輯器 行編輯器QLineEdit部件是一個(gè)單行的文本編輯器,它允許用戶輸入和編輯單行的純文本內(nèi)容,而且提供了一系列有用的功能,包括撤銷與恢復(fù)

49、、剪切和拖放等操作。 例如:n顯示模式顯示模式 n輸入掩碼輸入掩碼 n輸入驗(yàn)證輸入驗(yàn)證 n自動(dòng)補(bǔ)全自動(dòng)補(bǔ)全 45例:自動(dòng)補(bǔ)全功能例:自動(dòng)補(bǔ)全功能 在在QLineEditQLineEdit中也提供了強(qiáng)大的自動(dòng)補(bǔ)全功能,這是利用中也提供了強(qiáng)大的自動(dòng)補(bǔ)全功能,這是利用QCompleterQCompleter類實(shí)現(xiàn)的:類實(shí)現(xiàn)的:QStringList wordList;wordList Qt Qt Creator setCaseSensitivity(Qt:CaseInsensitive); ui-lineEdit4-setCompleter(completer);46數(shù)值設(shè)定框數(shù)值設(shè)定框 QAbstractSpinBoxQAbstractSpinBox類是一個(gè)抽象基類,它提供了一個(gè)數(shù)值類是一個(gè)抽象基類,它提供了一個(gè)數(shù)值設(shè)定框和一個(gè)行編輯器來(lái)顯示設(shè)定值。它有三個(gè)子類:設(shè)定框和一個(gè)行編輯器來(lái)顯示設(shè)定值。它有三個(gè)子類:nQDateTimeEditQDateTimeEdit(日期時(shí)間設(shè)定)(日期時(shí)間設(shè)定)nQSpinBoxQSpinBox(

溫馨提示

  • 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)論