




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
Qt6.2/C++程序設(shè)計(jì)與桌面應(yīng)用開(kāi)發(fā)21世紀(jì)高等學(xué)校計(jì)算機(jī)類課程創(chuàng)新規(guī)劃教材–微課視頻版教材目錄第1章初識(shí)Qt框架第2章Qt開(kāi)發(fā)基礎(chǔ)第3章界面設(shè)計(jì)組件第4章主框架窗口第5章對(duì)話框設(shè)計(jì)第6章事件系統(tǒng)第7章文件與數(shù)據(jù)庫(kù)第8章模型/視圖結(jié)構(gòu)第9章圖形繪制第10章多媒體編程第11章網(wǎng)絡(luò)編程第12章進(jìn)程與線程教材目錄第1章初識(shí)Qt框架1.1Qt簡(jiǎn)介1.2開(kāi)發(fā)環(huán)境搭建1.3程序設(shè)計(jì)方式1.4項(xiàng)目結(jié)構(gòu)分析1.1Qt簡(jiǎn)介Qt是一個(gè)基于C++面向?qū)ο蟪绦蛟O(shè)計(jì)語(yǔ)言、功能全面、跨平臺(tái)的圖形用戶界面(GUI)應(yīng)用程序框架。它提供了一種高效的、真正基于組件編程模式的應(yīng)用程序設(shè)計(jì)解決方案。Qt實(shí)際上就是一套C++應(yīng)用程序開(kāi)發(fā)類庫(kù),與MicrosoftMFC類似。歷史及應(yīng)用1、發(fā)展歷程Qt由挪威Trolltech(奇趣科技)公司于1991年開(kāi)發(fā),在2008年,Trolltech公司被諾基亞公司收購(gòu),Qt也因此成為諾基亞旗下的編程語(yǔ)言工具。2012年,芬蘭的Digia公司完成對(duì)諾基亞公司Qt技術(shù)平臺(tái)和知識(shí)產(chǎn)權(quán)的收購(gòu),Qt由此歸屬于Digia公司。2014年,Digia成立獨(dú)立的Qt公司,專門負(fù)責(zé)Qt的開(kāi)發(fā)、維護(hù)和商業(yè)推廣。歷史及應(yīng)用2、應(yīng)用實(shí)例自1995年以來(lái),Qt逐步進(jìn)入商業(yè)領(lǐng)域,已成為數(shù)以萬(wàn)計(jì)商業(yè)和開(kāi)源應(yīng)用程序的基礎(chǔ)。QtC++框架一直都是商業(yè)應(yīng)用程序的核心,無(wú)論是跨國(guó)公司和大型組織,如Adobe、Boeing、Google、IBM、Motorola、NASA、Skype等,還是無(wú)數(shù)小型公司和組織都在使用Qt進(jìn)行各種類型應(yīng)用程序的開(kāi)發(fā)。歷史及應(yīng)用在桌面應(yīng)用領(lǐng)域,下面這些著名的軟件都用到了Qt。(1)Maya,由Autodesk公司出品的優(yōu)秀三維動(dòng)畫(huà)制作軟件。2011版開(kāi)始使用Qt進(jìn)行開(kāi)發(fā)。(2)WPSOffice,是由金山軟件股份有限公司自主研發(fā)的一款辦公軟件套裝,可以實(shí)現(xiàn)辦公軟件最常用的文字、表格、演示,PDF閱讀等多種功能。(3)VirtualBox,是運(yùn)行在x86上的一款虛擬機(jī)軟件,目前屬于Oracle公司。運(yùn)行該軟件的操作系統(tǒng)被稱為主操作系統(tǒng)。該軟件運(yùn)行時(shí),向用戶呈現(xiàn)一個(gè)虛擬的計(jì)算機(jī),用戶可以在這個(gè)虛擬計(jì)算機(jī)上安裝一個(gè)從屬操作系統(tǒng)。版本與特點(diǎn)Qt的發(fā)行版本分為商業(yè)版和開(kāi)源版。商業(yè)版提供給用戶進(jìn)行商業(yè)軟件開(kāi)發(fā),它是一個(gè)傳統(tǒng)的商業(yè)軟件,并提供協(xié)議有效期內(nèi)的免費(fèi)升級(jí)和技術(shù)支持服務(wù);Qt開(kāi)源版是為了開(kāi)發(fā)自由而設(shè)計(jì)的開(kāi)放源碼軟件,它提供了和商業(yè)版本基本相同的功能,在GNU通用公共許可證下免費(fèi)供用戶使用。經(jīng)過(guò)二十多年的發(fā)展與進(jìn)步,Qt的版本已經(jīng)從Qt5更新到了Qt6。本教材使用Qt6.2.1LTS,它是Qt6的第1個(gè)長(zhǎng)期支持(LTS,longtermsupported)版本。版本與特點(diǎn)Qt的主要特點(diǎn):(1)跨平臺(tái)Qt支持PC和服務(wù)器的平臺(tái),包括Windows、Linux和macOS等,還支持移動(dòng)和嵌入式操作系統(tǒng),如iOS、EmbeddedLinux、Android和WinRT等??缙脚_(tái)意味著只需要編寫(xiě)一次程序,在不同平臺(tái)上無(wú)需改動(dòng)或只需少許改動(dòng)后再編譯,就可以形成在不同平臺(tái)上運(yùn)行的版本。這種跨平臺(tái)特性為開(kāi)發(fā)者提供了極大的便利。版本與特點(diǎn)(2)面向?qū)ο驫t的良好封裝機(jī)制使得Qt的模塊化程度非常高,可重用性好,對(duì)于用戶開(kāi)發(fā)來(lái)說(shuō)是非常方便的。另外,Qt提供了一種稱為signal/slot(信號(hào)/槽)的通信機(jī)制,這使得各個(gè)元件之間的協(xié)同工作變得更為簡(jiǎn)單安全。(2)豐富的API
Qt包括多達(dá)300多個(gè)C++類,除了用于用戶界面開(kāi)發(fā),還可用于文件操作、數(shù)據(jù)庫(kù)處理、2D/3D圖形渲染、多媒體操作和網(wǎng)絡(luò)通信等。1.2開(kāi)發(fā)環(huán)境搭建Qt應(yīng)用開(kāi)發(fā)一般都使用集成開(kāi)發(fā)環(huán)境。目前,支持Qt應(yīng)用開(kāi)發(fā)的集成工具有很多,其中能夠跨平臺(tái)使用的主要有QtCreator、QDevelop、Eclipse、MonkeyStudio和Code::Blocks等。除此之外,還有在X11平臺(tái)上使用的Kdevelop,在Windows平臺(tái)上使用的MicrosoftVisualStudio,以及在Mac平臺(tái)上使用的Xcode等。下載與安裝1、下載與Qt5版本不同的是,Qt6只能使用在線安裝器進(jìn)行安裝。下載Qt的軟件安裝器有多種途徑,可以到Qt的官方網(wǎng)站上進(jìn)行下載,其網(wǎng)址為:https://www.qt.io/download也可以使用國(guó)內(nèi)的Qt鏡像網(wǎng)址或者一些其他的軟件資源下載平臺(tái)。建議使用清華大學(xué)開(kāi)源軟件鏡像網(wǎng)站下載Qt的在線安裝器。其網(wǎng)址為:/qt/official_releases/online_installers/下載與安裝2、安裝運(yùn)行Qt軟件安裝器,根據(jù)向?qū)崾据斎胂鄳?yīng)的信息。注意Qt組件選擇(SelectComponense)這個(gè)步驟,其界面如圖所示。這是Qt安裝中非常重要的一個(gè)步驟,建議優(yōu)先安裝Qt的基礎(chǔ)組件,待開(kāi)發(fā)過(guò)程中根據(jù)應(yīng)用程序業(yè)務(wù)邏輯的實(shí)際需要,再進(jìn)行有針對(duì)性的補(bǔ)充。另外,除了安裝Qt庫(kù)之外,還需要安裝QtCreator等開(kāi)發(fā)和設(shè)計(jì)工具。如圖所示集成開(kāi)發(fā)工具本教材使用QtCreator集成開(kāi)發(fā)工具進(jìn)行Qt應(yīng)用程序的開(kāi)發(fā),版本為5.0.2。QtCreator是Qt官方推出的一款跨平臺(tái)開(kāi)源集成開(kāi)發(fā)工具,具有界面簡(jiǎn)潔、操作方便、與Qt結(jié)合完美等特點(diǎn)。其界面如下圖所示。菜單欄模式選擇器構(gòu)建套件選擇器定位器輸出窗格QtCreator界面編輯模式項(xiàng)目視圖類視圖代碼編輯窗口QtCreator集成開(kāi)發(fā)環(huán)境的設(shè)置:通過(guò)“Tools|Options”菜單命令打開(kāi)的“Options”窗口來(lái)完成。如圖所示QtCreator設(shè)置【例1.1】編寫(xiě)一個(gè)基于Qt的HelloWorld程序。程序運(yùn)行后,在窗口中顯示“HelloWorld”字符串,運(yùn)行結(jié)果如下圖所示。QtCreator應(yīng)用(1)啟動(dòng)QtCreator開(kāi)發(fā)工具,選擇File|NewFileorProject菜單命令,或者單擊Welcome模式中的Projects+New按鈕,打開(kāi)“NewProject”對(duì)話框。(2)在“NewProject”對(duì)話框中選擇Application(Qt)中的QtWidgetsApplication項(xiàng)目模板,單擊“Choose…”按鈕,打開(kāi)Qt應(yīng)用程序創(chuàng)建向?qū)А?3)設(shè)置項(xiàng)目名稱為“examp1_1”,指定項(xiàng)目存放位置為“F:\chap01”
(4)選擇默認(rèn)的qmake項(xiàng)目構(gòu)建系統(tǒng)(5)選擇QWidget基類,其他使用系統(tǒng)默認(rèn)值(6)本項(xiàng)目不使用其他語(yǔ)言(7)選擇項(xiàng)目的構(gòu)建套件,這里使用DesktopQt6.2.1MinGW64-bit(8)不向項(xiàng)目中添加其他子項(xiàng)目,也不設(shè)置版本控制。單擊“Finish”按鈕,完成項(xiàng)目(9)展開(kāi)“Projects”窗口中項(xiàng)目名稱節(jié)點(diǎn)下的“Forms”分組,雙擊該分組中的widget.ui窗體界面文件,打開(kāi)QtDesigner界面設(shè)計(jì)器,對(duì)應(yīng)用程序主窗口界面進(jìn)行可視化設(shè)計(jì)。(10)點(diǎn)擊窗體,設(shè)置其大小(WidthxHeight)為320x240;窗體標(biāo)題(windowTitle)為“例1.1”。(11)在窗體中設(shè)置Label控件和PushButton控件,分別用來(lái)顯示字符串和執(zhí)行窗口關(guān)閉命令。在窗體中設(shè)置控件,直接用鼠標(biāo)將控件從控件箱拖動(dòng)到窗口中的適當(dāng)位置即可。(12)分別點(diǎn)擊窗體中的Label控件和PushButton控件,將其text屬性分別設(shè)置為“HelloWorld”和“退出”。(13)保存文件,單擊QtCreator左邊欄中的Run按鈕,構(gòu)建并運(yùn)行應(yīng)用程序(14)再次打開(kāi)窗體設(shè)計(jì)器,按快捷鍵F4將窗體的編輯狀態(tài)切換成“EditSignalsandSlots”,選擇“退出”按鈕并拖動(dòng)鼠標(biāo)至窗體中,彈出“ConfigureConnection”對(duì)話框(15)保存文件,再次單擊QtCreator左邊欄中的“Run”按鈕,運(yùn)行應(yīng)用程序。此時(shí),若單擊主窗口中的“退出”按鈕,應(yīng)用程序主窗口會(huì)隨即關(guān)閉。1.3程序設(shè)計(jì)方式搭建好Qt開(kāi)發(fā)環(huán)境后,就可以開(kāi)始進(jìn)行Qt應(yīng)用程序的開(kāi)發(fā)了。Qt應(yīng)用程序的開(kāi)發(fā)可以采用3種程序設(shè)計(jì)方式,即可視化設(shè)計(jì)方式、代碼化設(shè)計(jì)方式和混合式設(shè)計(jì)方式。可視化設(shè)計(jì)1、可視化設(shè)計(jì)所謂可視化設(shè)計(jì)方式,就是應(yīng)用程序框架通過(guò)向?qū)ё詣?dòng)生成,然后使用QtDesigner設(shè)計(jì)器進(jìn)行窗體界面布局設(shè)計(jì)、Action設(shè)計(jì),以及信號(hào)和槽的添加等操作。例如,上述例1.1應(yīng)用程序的開(kāi)發(fā)所采用的就是可視化設(shè)計(jì)方法?!纠?.2】重新編寫(xiě)例1.1中的HelloWorld應(yīng)用程序,將應(yīng)用程序主窗口基類設(shè)置為QDialog,并使主窗口中的字符串和按鈕控件均水平居中對(duì)齊。運(yùn)行結(jié)果如圖所示。(1)打開(kāi)QtCreator開(kāi)發(fā)工具,生成一個(gè)名為examp1_2的Qt應(yīng)用程序,并將主窗口標(biāo)題設(shè)置為“例1.2”。操作方法如例1.1所示。(2)在窗體中設(shè)置Label控件和PushButton控件,并添加3個(gè)VerticalSpacer控件,對(duì)象名稱使用默認(rèn)值(3)選擇主窗口中的全部控件,單擊工具欄中的“垂直布局管理器”圖標(biāo),在主窗口中添加一個(gè)VerticalLayout控件,對(duì)象名稱使用默認(rèn)值,并調(diào)整其大小(4)分別選擇Label控件和PushButton控件,在屬性窗口中設(shè)置其text屬性值分別為“HelloWorld”和“退出”,并通過(guò)右鍵菜單設(shè)置其水平居中對(duì)齊(5)實(shí)現(xiàn)“退出”按鈕的單擊功能。單擊“SignalsandSlotsEditer”窗口中的“+”按鈕,添加一個(gè)新的信號(hào)與槽。設(shè)置Sender、Signal、Receiver和Slot分別為pushButton、clicked()、Dialog和close()
(6)保存文件,單擊QtCreator左邊欄中的“Run”按鈕,運(yùn)行應(yīng)用程序。單擊主窗口中的“退出”按鈕,主窗口隨即關(guān)閉。2、代碼化設(shè)計(jì)所謂代碼化設(shè)計(jì)方法,就是應(yīng)用程序的所有代碼均手工添加完成,而不使用QtDesigner等設(shè)計(jì)工具。代碼化設(shè)計(jì)【例1.3】使用手工編碼的方式,完成例1.2程序功能。(1)打開(kāi)QtCreator開(kāi)發(fā)工具,選擇“Projects”下的“OtherProject”模板中的“EmptyqmakeProject”模板,生成一個(gè)名為examp1_3的空Qt應(yīng)用程序。(2)雙擊打開(kāi)應(yīng)用程序的項(xiàng)目文件“examp1_3.pro”,在文件中添加如下文本行,將Qt的Widgets模塊加載到項(xiàng)目中。QT+=widgets(3)右擊新生成的項(xiàng)目文件夾examp1_3,在彈出的快捷菜單中選擇“AddNew…”菜單命令,打開(kāi)“新文件”對(duì)話框。向項(xiàng)目中添加一個(gè)名為“main.cpp”的C++源文件。(4)雙擊打開(kāi)main.cpp文件,在文件中添加代碼,實(shí)現(xiàn)程序功能。創(chuàng)建主窗口對(duì)象,并設(shè)置其屬性創(chuàng)建主窗口中的控件對(duì)象,并設(shè)置其屬性創(chuàng)建主窗口的垂直布局,并設(shè)置控件信號(hào)與槽(5)單擊QtCreator中的“運(yùn)行”按鈕,即可得到程序的運(yùn)行結(jié)果。如圖1.40所示。單擊對(duì)話框中的“退出”按鈕,即可關(guān)閉程序的主對(duì)話框。3、混合式設(shè)計(jì)使用可視化設(shè)計(jì)方法開(kāi)發(fā)Qt應(yīng)用程序,不需要人工編寫(xiě)代碼去處理大量繁瑣的界面組件的創(chuàng)建和布局管理工作,可以直觀地進(jìn)行界面設(shè)計(jì),從而大大提高了應(yīng)用程序開(kāi)發(fā)的工作效率。但該設(shè)計(jì)方法也存在一些缺陷,如某些組件無(wú)法可視化地添加到界面上,此時(shí)就必須手工編寫(xiě)代碼來(lái)實(shí)現(xiàn)相應(yīng)的部件功能。采用純代碼方式進(jìn)行Qt應(yīng)用程序開(kāi)發(fā),能夠設(shè)計(jì)出非常精美的用戶界面,并且可以實(shí)現(xiàn)非常復(fù)雜的業(yè)務(wù)邏輯。但是設(shè)計(jì)效率太低,過(guò)程也非常的繁瑣。因此,在實(shí)際的開(kāi)發(fā)過(guò)程中,常常使用混合的設(shè)計(jì)方法,能夠使用可視化設(shè)計(jì)的就盡可能可視化設(shè)計(jì)解決,無(wú)法可視化實(shí)現(xiàn)的再用純代碼的方法解決?;旌鲜皆O(shè)計(jì)【例1.4】使用混合式設(shè)計(jì)方法,實(shí)現(xiàn)例1.2的程序功能。要求在“退出”按鈕上添加菜單,當(dāng)選擇菜單中的“確定”命令時(shí),關(guān)閉應(yīng)用程序主窗口。如圖所示。(1)打開(kāi)QtCreator開(kāi)發(fā)工具,生成一個(gè)名為examp1_4的Qt應(yīng)用程序。將主窗口標(biāo)題設(shè)置為“例1.4”,并按照例1.1的操作步驟,向主窗口中添加控件及布局管理器。這里采用可視化程序設(shè)計(jì)方法完成應(yīng)用程序框架的生成與主窗口界面的設(shè)計(jì)。(2)編寫(xiě)代碼,實(shí)現(xiàn)新增功能。由于在QtDesigner中不能直接將菜單放置在“退出”按鈕控件上,所以必須采用代碼化方式來(lái)實(shí)現(xiàn)相關(guān)的界面功能。(3)保存文件,構(gòu)建并運(yùn)行應(yīng)用程序。單擊“退出”按鈕,彈出按鈕菜單,選擇“確定”菜單命令,應(yīng)用程序主窗口隨即關(guān)閉。1.4項(xiàng)目結(jié)構(gòu)分析Qt應(yīng)用程序一般都包含有多個(gè)文件,這些相關(guān)聯(lián)的文件被組織在一起,以“項(xiàng)目”的形式進(jìn)行統(tǒng)一管理。下面以例1.1創(chuàng)建的程序?yàn)槔?jiǎn)要分析一下Qt應(yīng)用程序項(xiàng)目的文件類型、作用,以及程序的運(yùn)行機(jī)制。1、項(xiàng)目文件組成在QtCreator中打開(kāi)例1.1中的Qt項(xiàng)目examp1_1,切換到“Edit”模式,展開(kāi)項(xiàng)目視圖中的各個(gè)文件分組。如圖所示。項(xiàng)目文件組成從圖中可以看到,項(xiàng)目examp1_1包含4種類型的文件,分別是項(xiàng)目文件examp1_1.pro、主函數(shù)文件main.cpp、類文件widget.h/widget.cpp和界面文件widget.ui。項(xiàng)目文件用于項(xiàng)目管理,包括項(xiàng)目設(shè)置、使用的Qt模塊、包含的文件等信息;主函數(shù)文件是實(shí)現(xiàn)main()函數(shù)的文件,main()函數(shù)是C++應(yīng)用程序入口函數(shù),其主要功能是創(chuàng)建應(yīng)用程序、創(chuàng)建窗口、顯示窗口、運(yùn)行程序、啟動(dòng)應(yīng)用程序的消息循環(huán)和事件處理;類文件包括項(xiàng)目中類的聲明及實(shí)現(xiàn)文件;界面文件是使用QtDesigner進(jìn)行界面設(shè)計(jì)生成的文件,它實(shí)際上就是一個(gè)XML文件,用于管理界面中的窗體、部件、信號(hào)/槽等信息。需要注意的是,Qt項(xiàng)目中的界面文件在項(xiàng)目構(gòu)建后將被轉(zhuǎn)換成類文件。展開(kāi)項(xiàng)目examp1_1構(gòu)建生成的文件夾build-examp1_1-Desktop_Qt_6_2_1_MinGW_64_bit-Debug,可以看到有一個(gè)名為ui_widget.h的文件,該文件就是由examp1_1.ui界面文件生成的類文件。除了上述介紹的文件之外,Qt項(xiàng)目中還可能有一些其他類型的文件,例如管理項(xiàng)目資源的資源文件、存儲(chǔ)項(xiàng)目數(shù)據(jù)的文本文件或二進(jìn)制文件等。需要說(shuō)明一下的是,上面的項(xiàng)目結(jié)構(gòu)分析是以examp1_1應(yīng)用為例講解的,而examp1_1是采用qmake項(xiàng)目構(gòu)建系統(tǒng)構(gòu)建的。其實(shí),QtCreator集成開(kāi)發(fā)工具提供了3種項(xiàng)目構(gòu)建系統(tǒng),它們是qmake、CMake和Qbs,如圖1.18所示(展開(kāi)Buildsystem組合框)。采用不同的項(xiàng)目構(gòu)建系統(tǒng)構(gòu)建的Qt項(xiàng)目,其項(xiàng)目結(jié)構(gòu)是不一樣的。程序運(yùn)行機(jī)制2、程序運(yùn)行機(jī)制Qt程序是屬于C++的,它的入口主函數(shù)仍然是main()下面是examp1_1項(xiàng)目中main.cpp文件內(nèi)容:第一步:創(chuàng)建一個(gè)Qt應(yīng)用程序?qū)嵗齉Application是Qt的標(biāo)準(zhǔn)應(yīng)用程序類,它的實(shí)例a就是一個(gè)Qt應(yīng)用程序?qū)ο?。第二步:?chuàng)建應(yīng)用程序主窗口并顯示W(wǎng)idget是繼承于QWidget的派生類,QWidget是Qt的窗體類,所以Widget類的實(shí)例w就是一個(gè)Qt窗口對(duì)象。通過(guò)對(duì)象w調(diào)用其成員函數(shù)show()實(shí)現(xiàn)應(yīng)用程序主窗口的顯示。第三步:?jiǎn)?dòng)應(yīng)用程序并開(kāi)始應(yīng)用程序的消息循環(huán)和事件處理通過(guò)對(duì)象a調(diào)用其成員函數(shù)exec()啟動(dòng)應(yīng)用程序的執(zhí)行,QApplication類的exec()函數(shù)會(huì)讓?xiě)?yīng)用程序進(jìn)行消息循環(huán),也就是將主窗口持續(xù)顯示,等待用戶的下一步操作。課后作業(yè)思政本章結(jié)束Qt6.2/C++程序設(shè)計(jì)與桌面應(yīng)用開(kāi)發(fā)21世紀(jì)高等學(xué)校計(jì)算機(jī)類課程創(chuàng)新規(guī)劃教材–微課視頻版教材目錄第1章初識(shí)Qt框架第2章Qt開(kāi)發(fā)基礎(chǔ)第3章界面設(shè)計(jì)組件第4章主框架窗口第5章對(duì)話框設(shè)計(jì)第6章事件系統(tǒng)第7章文件與數(shù)據(jù)庫(kù)第8章模型/視圖結(jié)構(gòu)第9章圖形繪制第10章多媒體編程第11章網(wǎng)絡(luò)編程第12章進(jìn)程與線程教材目錄第2章Qt開(kāi)發(fā)基礎(chǔ)2.1Qt應(yīng)用概述2.2元對(duì)象系統(tǒng)2.3信號(hào)與槽2.4常用Qt工具類2.1Qt應(yīng)用概述Qt是一個(gè)采用標(biāo)準(zhǔn)C++程序設(shè)計(jì)語(yǔ)言編寫(xiě)的、跨平臺(tái)的應(yīng)用程序開(kāi)發(fā)類庫(kù),它對(duì)標(biāo)準(zhǔn)C++進(jìn)行了擴(kuò)展,引入了元對(duì)象系統(tǒng)、信號(hào)與槽、動(dòng)態(tài)屬性等一些新的特性。由于Qt對(duì)標(biāo)準(zhǔn)C++進(jìn)行了擴(kuò)展,因此,Qt應(yīng)用程序也擁有了一些自己的特性。Qt應(yīng)用特點(diǎn)與標(biāo)準(zhǔn)的C++應(yīng)用程序相比較,Qt應(yīng)用主要有如下特點(diǎn):(1)使用特有的宏擴(kuò)展類的功能Qt的類中常常會(huì)設(shè)置一些特有的宏,例如Q_CLASSINFO()、Q_OBJECT、Q_PROPERTY()、Q_SIGNALS和Q_SLOTS等,來(lái)實(shí)現(xiàn)Qt的一些擴(kuò)展功能(2)使用信號(hào)與槽機(jī)制實(shí)現(xiàn)對(duì)象間通信信號(hào)與槽是Qt的一個(gè)核心特點(diǎn),也是區(qū)別于其他框架的重要特性。信號(hào)與槽是Qt對(duì)象間進(jìn)行通信的機(jī)制,在第1章的例1.1應(yīng)用程序中,我們使用這種機(jī)制完成了單擊“退出”按鈕來(lái)關(guān)閉主窗口的操作,也就是完成了Qt的QPushBotton對(duì)象與QWidget對(duì)象間的通信。像這樣對(duì)象間的通信,在VisualC++MFC框架中,則是通過(guò)“消息”映射的方式來(lái)實(shí)現(xiàn)的。(3)使用元對(duì)象編譯器進(jìn)行預(yù)處理。由于Qt對(duì)標(biāo)準(zhǔn)C++進(jìn)行了擴(kuò)展,增加了像信號(hào)/槽、屬性系統(tǒng)等一些新的功能,所以在Qt應(yīng)用程序中的一些代碼不能直接使用標(biāo)準(zhǔn)C++編譯器進(jìn)行編譯,需要先將其轉(zhuǎn)換成標(biāo)準(zhǔn)C++兼容的形式。Qt的元對(duì)象編譯器(Meta-ObjectCompiler,MOC)是一個(gè)預(yù)處理器,在源程序被編譯前先將具有Qt特性的程序轉(zhuǎn)換為標(biāo)準(zhǔn)C++兼容的形式,然后再由標(biāo)準(zhǔn)C++編譯器進(jìn)行編譯與鏈接。(4)使用不同類型的文件實(shí)現(xiàn)不同的功能Qt應(yīng)用程序是由多個(gè)不同類型的文件組成的,除了我們?cè)?.4.1節(jié)中分析的項(xiàng)目文件(*.pro)、類文件(*.h和*.cpp)以及界面文件(*.ui)之外,還包括實(shí)現(xiàn)元對(duì)象系統(tǒng)(Meta–ObjectSystem)特性的MOC預(yù)處理文件(moc_*.h、moc_*.cpp和moc_*.o)以及對(duì)資源進(jìn)行管理的資源文件(*.qrc)等。這些文件分別實(shí)現(xiàn)不同的功能,最后由標(biāo)準(zhǔn)C++編譯器將它們編譯、鏈接成一個(gè)整體。Qt應(yīng)用功能Qt應(yīng)用的功能取決于用戶需求以及開(kāi)發(fā)中所使用的Qt類。Qt類庫(kù)中的類是以模塊方式進(jìn)行組織和管理的,版本不同其模塊數(shù)量、各個(gè)模塊中包含的類都會(huì)不一樣。Qt6.2.1的模塊被分成了QtEssentials(基本模塊)和QtAdd-Ons(附加模塊)兩大類。1、基本功能Qt應(yīng)用的基本功能由Qt基本模塊中的類來(lái)實(shí)現(xiàn),這些類在所有的開(kāi)發(fā)平臺(tái)和目標(biāo)平臺(tái)上均可使用。Qt6.2.1的基本模塊及其功能描述,如下表所示。2、特定功能Qt應(yīng)用的特定功能由Qt附加模塊中的類來(lái)實(shí)現(xiàn)。Qt中的附加模塊實(shí)現(xiàn)一些特定的目的,它們可能只針對(duì)某些開(kāi)發(fā)平臺(tái),或只能用于某些操作系統(tǒng),或只是為了向后兼容。Qt6.2.1的附加模塊及其功能描述,如下表所示。2.2元對(duì)象系統(tǒng)Qt的元對(duì)象系統(tǒng)(Meta-ObjectSystem)提供了對(duì)象之間通信的信號(hào)與槽機(jī)制、運(yùn)行時(shí)類型信息和動(dòng)態(tài)屬性系統(tǒng)。1、對(duì)象模型標(biāo)準(zhǔn)C++對(duì)象模型可以在運(yùn)行時(shí)非常有效地支持對(duì)象范式(objectparadigm),但是它的靜態(tài)特性在一些問(wèn)題領(lǐng)域中不夠靈活。Qt在標(biāo)準(zhǔn)C++對(duì)象模型的基礎(chǔ)上添加了一些特性,形成了自己的對(duì)象模型。這些特性主要有:(1)一個(gè)強(qiáng)大的無(wú)縫對(duì)象通信機(jī)制,即信號(hào)與槽(signalsandslots);(2)可查詢和可設(shè)計(jì)的對(duì)象屬性系統(tǒng)(objectproperties);(3)強(qiáng)大的事件和事件過(guò)濾器(eventsandeventfilters);對(duì)象模型(4)通過(guò)上下文進(jìn)行國(guó)際化的字符串翻譯機(jī)制(stringtranslationforinternationalization)(5)完善的定時(shí)器(timers)驅(qū)動(dòng),使得可以在一個(gè)事件驅(qū)動(dòng)的GUI中處理多個(gè)任務(wù);(6)分層結(jié)構(gòu)的、可查詢的對(duì)象樹(shù)(objecttrees),它使用一種很自然的方式來(lái)組織對(duì)象擁有權(quán)(objectownership);(7)守衛(wèi)指針即QPointer,它在引用對(duì)象被銷毀時(shí)自動(dòng)將其設(shè)置為0;(8)動(dòng)態(tài)的對(duì)象轉(zhuǎn)換機(jī)制(dynamiccast);(9)支持自定義類型的創(chuàng)建Qt對(duì)象模型基礎(chǔ)類及功能描述,如表2.3所示。2、元對(duì)象系統(tǒng)Qt的元對(duì)象系統(tǒng)以其對(duì)象模型為基礎(chǔ),由以下三個(gè)基礎(chǔ)組成。(1)使用元對(duì)象系統(tǒng)的類必須繼承于QObject類;(2)必須在類的private聲明區(qū)聲明Q_OBJECT宏;(3)使用MOC(Meta-ObjectCompiler,元對(duì)象編譯器)為每個(gè)QObject的子類實(shí)現(xiàn)元對(duì)象特性提供必要的代碼。元對(duì)象系統(tǒng)元對(duì)象系統(tǒng)主要是為了實(shí)現(xiàn)信號(hào)與槽機(jī)制而引入的,不過(guò)除了信號(hào)/槽機(jī)制以外,元對(duì)象系統(tǒng)還提供了其他的一些特性。例如:QObject::metaObject()函數(shù)返回類關(guān)聯(lián)的元對(duì)象;)QMetaObject::className()在運(yùn)行時(shí)返回類的名稱字符串,而不需要通過(guò)C++編譯器支持本機(jī)運(yùn)行時(shí)類型信息(RTTI);QObject::inherits()函數(shù)判斷一個(gè)對(duì)象是否為某個(gè)類或QObject子類的實(shí)例;等Qt提供了強(qiáng)大的基于元對(duì)象系統(tǒng)的屬性系統(tǒng)(PropertySystem),可以在能夠運(yùn)行Qt應(yīng)用程序的平臺(tái)上支持任意的標(biāo)準(zhǔn)C++編譯器。通過(guò)Qt的屬性系統(tǒng),不僅可以靜態(tài)或動(dòng)態(tài)地定義屬性、設(shè)置屬性值、查詢屬性,還可以為類定義一些其他的附加信息。屬性系統(tǒng)1、屬性的定義在一個(gè)Qt類中聲明屬性,要求該類必須是QObject類的派生類,并且需要通過(guò)Q_PROPERTY()宏來(lái)定義。其語(yǔ)法格式如下:下面是QWidget類中定義屬性示例:【例2.1】編寫(xiě)一個(gè)非GUI的Qt應(yīng)用程序,演示使用Q_PROPERTY宏定義屬性的方法。要求為應(yīng)用程序添加一個(gè)名為Student的QObject派生類,并在該類中定義屬性name及操作函數(shù)。(1)打開(kāi)QtCreator集成開(kāi)發(fā)環(huán)境,創(chuàng)建一個(gè)非GUI的Qt應(yīng)用程序,項(xiàng)目名稱為examp2_1。(2)選擇主菜單中的File|NewFileorProject…菜單命令,打開(kāi)“NewFileorProject”對(duì)話框(3)選擇“FilesandClasses”列表框中的“C/C++”選項(xiàng),向項(xiàng)目中添加一個(gè)名為Student的C++類,其基類為QObject(4)打開(kāi)Student類的頭文件及實(shí)現(xiàn)文件,在其中添加陰影部分的代碼。(5)打開(kāi)main.cpp文件,在主函數(shù)main()中添加如下陰影部分的代碼。(6)構(gòu)建并運(yùn)行程序。輸出結(jié)果如圖所示。2、屬性的使用類的屬性定義完成后,就可以在程序中使用該屬性了。屬性的使用包括屬性的設(shè)置與讀取等操作。在例2.1應(yīng)用程序的主函數(shù)中,使用Student對(duì)象的setName()函數(shù)對(duì)name屬性進(jìn)行了設(shè)置,同時(shí)使用property()函數(shù)讀取到了該對(duì)象的name屬性值。property()函數(shù)是QObject類的成員函數(shù),原型為:QVariantQObject::property(constchar*name)const3、動(dòng)態(tài)屬性當(dāng)使用QObject::setProperty()函數(shù)為對(duì)象設(shè)置屬性時(shí),若該屬性不存在,函數(shù)會(huì)為類定義一個(gè)新的屬性,這個(gè)新屬性稱之為動(dòng)態(tài)屬性。動(dòng)態(tài)屬性是在運(yùn)行時(shí)定義的,它只屬于正在運(yùn)行的類的實(shí)例。4、附加信息在Qt的屬性系統(tǒng)中,還可以使用Q_CLASSINFO()宏來(lái)為類定義一些附加信息。該宏的語(yǔ)法格式如下:Q_CLASSINFO(Name,Value)其中,Name表示信息名稱,Value表示信息內(nèi)容。例如:Q_CLASSINFO(“author”,”mashian”)Q_CLASSINFO(“version”,”1.0.1”)【例2.2】編寫(xiě)一個(gè)Qt應(yīng)用程序,在程序主窗口中顯示自定義類的對(duì)象屬性信息,以及自定義類的類信息。運(yùn)行結(jié)果如圖所示。(1)打開(kāi)QtCreator集成開(kāi)發(fā)環(huán)境,創(chuàng)建一個(gè)基于QWidget的Qt應(yīng)用程序,項(xiàng)目名稱為examp2_2。(2)使用例2.1中相同的方法,為項(xiàng)目添加一個(gè)名為Student的新類。如圖2.5所示。為了覆蓋更多的知識(shí)點(diǎn),這里沒(méi)有使用例2.1中的Student類。(3)雙擊項(xiàng)目中的widget.ui界面文件,打開(kāi)界面設(shè)計(jì)器。在項(xiàng)目主窗口中添加一個(gè)名為plainTextEdit的QPlainTextEdit類部件,用于顯示Student類的相關(guān)信息。如圖所示。(4)打開(kāi)項(xiàng)目文件widget.h,為Widget類添加一個(gè)私有的Student對(duì)象指針student和成員函數(shù)getInfo()的聲明。代碼如下陰影部分所示。(5)打開(kāi)項(xiàng)目文件widget.cpp,在Widget類的構(gòu)造函數(shù)中添加代碼,并實(shí)現(xiàn)成員函數(shù)getInfo()的功能。代碼如下陰影部分所示。2.3信號(hào)與槽信號(hào)與槽機(jī)制是Qt的核心機(jī)制,通過(guò)這種機(jī)制能夠在應(yīng)用程序中實(shí)現(xiàn)對(duì)象之間的通信。該通信機(jī)制是Qt對(duì)標(biāo)準(zhǔn)C++的擴(kuò)展,需要由Qt的元對(duì)象系統(tǒng)支持才能實(shí)現(xiàn)。概述1、概述Qt的信號(hào)與槽通信機(jī)制類似于Windows操作系統(tǒng)中的消息處理機(jī)制,但消息處理機(jī)制是基于回調(diào)函數(shù)的;而在Qt中,使用信號(hào)和槽來(lái)代替函數(shù)指針,從而使應(yīng)用程序更加安全與簡(jiǎn)潔。在應(yīng)用程序設(shè)計(jì)過(guò)程中,當(dāng)改變了一個(gè)對(duì)象的狀態(tài)時(shí),總希望其他對(duì)象(或自己)也能及時(shí)了解到這種狀態(tài)的變化,并做出相應(yīng)的響應(yīng)。在Qt編程中,這種對(duì)象間的通信就是采用信號(hào)與槽機(jī)制來(lái)實(shí)現(xiàn)的。Qt的信號(hào)與槽通信機(jī)制能夠完成任意兩個(gè)Qt對(duì)象之間的通信,其中,信號(hào)會(huì)在某個(gè)特定的情況或動(dòng)作下被觸發(fā),槽是等同于接收并處理信號(hào)的函數(shù)。在Qt中,每個(gè)對(duì)象都包含若干個(gè)預(yù)定義的信號(hào)和槽,當(dāng)某一個(gè)特定事件發(fā)生時(shí),一個(gè)信號(hào)被發(fā)送,與信號(hào)相關(guān)聯(lián)的槽則會(huì)響應(yīng)信號(hào)并完成相應(yīng)的處理。當(dāng)一個(gè)類被繼承時(shí),該類的信號(hào)和槽也同時(shí)被繼承。當(dāng)然,也可以根據(jù)需要自定義信號(hào)和槽。信號(hào)2、信號(hào)信號(hào)(signal)就是在特定情況下被發(fā)射(emit)的事件例如:例1.1中使用的clicked()信號(hào),就是QPushBotton按鈕被單擊時(shí)發(fā)射的“單擊”事件;例2.1中使用的nameChanged()信號(hào)是Student對(duì)象的屬性值發(fā)生變化時(shí)發(fā)射的“值變化”事件。在Qt中,信號(hào)通過(guò)關(guān)鍵字signals和信號(hào)函數(shù)在類的頭文件中聲明。如例2.1中的程序代碼:signals:voidnameChanged(QString);這里,signals是Qt的關(guān)鍵字,而非C++的關(guān)鍵字,它指出從此處進(jìn)入了信號(hào)聲明區(qū);信號(hào)函數(shù)nameChanged()定義了信號(hào)nameChanged,該信號(hào)在發(fā)射時(shí)會(huì)附帶一個(gè)QString類型的參數(shù)。信號(hào)函數(shù)中的參數(shù),就是對(duì)象之間通信時(shí)交換的數(shù)據(jù)槽3、槽槽(slot)就是對(duì)信號(hào)響應(yīng)的函數(shù)。槽函數(shù)和普通的C++成員函數(shù)一樣,可以定義在類的任何區(qū)域(public、private或protected),可以具有任何參數(shù),也可以被直接調(diào)用。不同的是,槽函數(shù)可以與一個(gè)或多個(gè)信號(hào)進(jìn)行關(guān)聯(lián)。當(dāng)與其關(guān)聯(lián)的信號(hào)被發(fā)送時(shí),這個(gè)槽就會(huì)被調(diào)用。槽可以有參數(shù),但槽的參數(shù)不能有默認(rèn)值。在Qt類的頭文件中,使用Qt的關(guān)鍵字slots標(biāo)識(shí)槽函數(shù)的聲明區(qū)。例如,例2.1中的程序代碼:publicslots:voidisNameChanged(QString);就是槽函數(shù)的聲明。Qt的槽就是一個(gè)普通的類成員函數(shù),除了在類的頭文件中聲明之外,還需要在類的實(shí)現(xiàn)文件中編寫(xiě)其實(shí)現(xiàn)代碼。關(guān)聯(lián)在Qt的信號(hào)與槽通信機(jī)制中,對(duì)象只負(fù)責(zé)發(fā)送信號(hào),它并不知道另一端是誰(shuí)在接收這個(gè)信號(hào);另外,一個(gè)槽也不知道是否有任何信號(hào)與自己相連接。將對(duì)象的信號(hào)與槽相關(guān)聯(lián),是實(shí)現(xiàn)對(duì)象間通信的關(guān)鍵。將信號(hào)與槽進(jìn)行關(guān)聯(lián),可以采用一對(duì)一、一對(duì)多或者多對(duì)一的形式,也可以將一個(gè)信號(hào)關(guān)聯(lián)到另外一個(gè)信號(hào)上。如圖2.7所示。在Qt中,信號(hào)與槽的關(guān)聯(lián)可以采用手動(dòng)的方式,也可以采用自動(dòng)的方式。1、手動(dòng)關(guān)聯(lián)信號(hào)與槽的手動(dòng)關(guān)聯(lián)通過(guò)調(diào)用QObject::connect()函數(shù)來(lái)實(shí)現(xiàn)。該函數(shù)原型如下:[static]QMetaObject::ConnectionQObject::connect(constQObject*sender,constchar*signal,constQObject*receiver,constchar*method,Qt::ConnectionTypetype=Qt::AutoConnection)其中:參數(shù)sender和receiver都是指向QObject(或其子類)對(duì)象的指針,前者指向發(fā)送信號(hào)的對(duì)象,后者指向處理信號(hào)的對(duì)象,兩者分別被稱為“發(fā)送者”和“接收者”;參數(shù)signal
和method
都是字符指針,分別指向信號(hào)函數(shù)和槽函數(shù);參數(shù)type是一個(gè)Qt::ConnectionType枚舉類型值,表示信號(hào)與槽之間的關(guān)聯(lián)方式connect()函數(shù)的簡(jiǎn)略格式:connect(sender,SIGNAL(signal_function()),receiver,SLOT(slot_function()))其中,signal_function()和slot_function()分別表示sender對(duì)象中定義的信號(hào)函數(shù)和receiver對(duì)象中定義的槽函數(shù)。例如,例1.4程序中的語(yǔ)句:connect(ok,SIGNAL(triggered()),this,SLOT(close()));QObject類的connect()函數(shù)是一個(gè)重載函數(shù),在Qt1的幫助文檔中可以查詢到它的6種參數(shù)形式。例如下面的格式:[static]QMetaObject::ConnectionQObject::connect(constQObject*sender,constQMetaMethod&signal,constQObject*receiver,constQMetaMethod&method,Qt::ConnectionTypetype=Qt::AutoConnection)給出的原型聲明中,使用函數(shù)指針signal和method來(lái)指向信號(hào)函數(shù)和槽函數(shù)。【例2.3】編寫(xiě)一個(gè)Qt應(yīng)用程序,在主窗口中模擬學(xué)生與老師的交流過(guò)程。如圖2.8所示,學(xué)生和老師分別在界面左、右側(cè)底部的文本編輯框中發(fā)送信息。(1)打開(kāi)QtCreator集成開(kāi)發(fā)環(huán)境,創(chuàng)建一個(gè)基于QWidget的Qt應(yīng)用程序,項(xiàng)目名稱為examp2_3。(2)雙擊項(xiàng)目中的widget.ui界面文件,打開(kāi)界面設(shè)計(jì)器。首先,將主窗口大小設(shè)置為400x200,標(biāo)題設(shè)置為“例2.3”;然后,在主窗口中放置2個(gè)“LineEdit”部件和2個(gè)“PlainTextEdit”部件,對(duì)象名稱分別為sLineEdit、tLineEdit和sPlainTextEdit、tPlainTextEdit(3)打開(kāi)Widget類的頭文件widget.h,聲明2個(gè)槽函數(shù)。代碼如下:(4)打開(kāi)Widget類的實(shí)現(xiàn)文件widget.cpp,添加槽函數(shù)實(shí)現(xiàn)代碼,并關(guān)聯(lián)信號(hào)與槽。代碼如下:(5)構(gòu)建并運(yùn)行程序。結(jié)果如圖2.8所示。這里使用connect()函數(shù)將信號(hào)與槽進(jìn)行手動(dòng)關(guān)聯(lián),信號(hào)和槽的設(shè)置采用了Qt的SIGNAL宏和SLOT宏也可以采用函數(shù)指針的參數(shù)形式來(lái)設(shè)置信號(hào)和槽,如下所示:2、自動(dòng)關(guān)聯(lián)信號(hào)與槽的自動(dòng)關(guān)聯(lián)是指不需要手動(dòng)使用connect()函數(shù),而是通過(guò)自動(dòng)命名槽函數(shù)的方式來(lái)實(shí)現(xiàn)信號(hào)與槽的關(guān)聯(lián)。在使用信號(hào)與槽的自動(dòng)關(guān)聯(lián)方式時(shí),槽函數(shù)的命名是關(guān)鍵。槽函數(shù)的原型格式為:voidon_<objectName>_<signalName>(<signalParameters>);其中,objectName表示發(fā)送信號(hào)的對(duì)象指針;signalName
表示信號(hào)名;signalParameters
表示發(fā)送信號(hào)時(shí)可能帶有的參數(shù)。信號(hào)與槽的自動(dòng)關(guān)聯(lián)通過(guò)元對(duì)象系統(tǒng)來(lái)實(shí)現(xiàn),實(shí)際上就是使用QMetaObject::connectSlotsByName()函數(shù)來(lái)代替QObject::connect()函數(shù)。該函數(shù)原型如下:[static]voidQMetaObject::connectSlotsByName(QObject*object)其中,參數(shù)object為QObject類或其子類的對(duì)象指針?!纠?.4】編寫(xiě)一個(gè)與例2.3功能相同的Qt應(yīng)用程序,使用自動(dòng)關(guān)聯(lián)方式連接相關(guān)的信號(hào)與槽。(1)打開(kāi)QtCreator集成開(kāi)發(fā)環(huán)境,創(chuàng)建一個(gè)基于QWidget的Qt應(yīng)用程序,項(xiàng)目名稱為examp2_4。(2)打開(kāi)界面設(shè)計(jì)器設(shè)計(jì)程序主窗口界面。如圖2.9所示。(3)右擊界面中的單行文本輸入框部件,在彈出的快捷菜單中選擇“Gotoslot…”菜單命令,如圖2.10所示;在接下來(lái)的“Selectsignal”對(duì)話框中選擇“editingFinished”信號(hào),如圖2.11所示。(4)單擊圖2.11中的“OK”按鈕,QtCreator為應(yīng)用程序的Widget類添加一個(gè)名為“on_sLineEdit_editingFinished()”的槽函數(shù)。如圖2.12所示。(5)用與上述(3)、(4)步驟中相同的方法,為應(yīng)用程序主窗口中的另一個(gè)單行文本輸入框部件添加槽函數(shù)。自動(dòng)添加的槽函數(shù)名稱為“on_tLineEdit_editingFinished()”。(6)將例2.3應(yīng)用程序的槽函數(shù)studentMessage()、teacherMessage()中的代碼復(fù)制到新添加的2個(gè)槽函數(shù)中。構(gòu)建并運(yùn)行程序,得到與例2.3應(yīng)用程序相同結(jié)果。2.4常用Qt工具類在Qt應(yīng)用開(kāi)發(fā)中,除了用于GUI界面設(shè)計(jì)的部件類之外,還需要使用一些工具類,例如Qt的字符串類、容器類,以及QVariant數(shù)據(jù)類等。字符串類1、字符串類標(biāo)準(zhǔn)C++提供了兩種字符串,一種是C語(yǔ)言風(fēng)格的以“\0”字符結(jié)尾的字符數(shù)組;另一種是字符串類String。在Qt中,使用QString類的對(duì)象來(lái)表示字符串。Qstring
使用Unicode編碼來(lái)存儲(chǔ)字符串,每一個(gè)字符都是一個(gè)16位的QChar,而不是8位的char。1、創(chuàng)建對(duì)象使用QString類的構(gòu)造方法創(chuàng)建Qt的字符串對(duì)象。例如:使用賦值運(yùn)行符(=或+=)重載函數(shù)通過(guò)賦值的方式來(lái)初始化字符串。例如:2、常用操作在QString類中定義了很多不同功能的成員函數(shù),使用這些函數(shù)可以對(duì)Qt中的字符串進(jìn)行處理。QString類的部分成員函數(shù)及功能如表2.8所示。3、轉(zhuǎn)換操作在QString類中定義了一些成員函數(shù),通過(guò)這些成員函數(shù)可以將字符串轉(zhuǎn)換為數(shù)值,也可以將數(shù)值字符串轉(zhuǎn)換為不同的進(jìn)制,還可以對(duì)字符串編碼、輸出格式等進(jìn)行轉(zhuǎn)換。表2.9給出了QString類中常用的轉(zhuǎn)換函數(shù)。4、查詢操作在QString類中定義了一些成員函數(shù),通過(guò)這些成員函數(shù)可以實(shí)現(xiàn)定位字符、提取子串、替換字符等相關(guān)操作。表2.10給出了QString類中部分常用的查詢相關(guān)操作函數(shù)。5、比較操作在Qt中,字符串的比較操作是通過(guò)QString類提供的一些成員函數(shù)或友元函數(shù)來(lái)實(shí)現(xiàn)的,其中大多數(shù)都是比較運(yùn)算符的重載函數(shù)。如表2.11所示。容器類Qt提供了一組通用的基于模板的容器類,用于存儲(chǔ)指定類型的數(shù)據(jù)項(xiàng)。與C++的標(biāo)準(zhǔn)模板庫(kù)(STL)中的容器類相比較,這些容器類更輕巧、更安全且更容易使用。1、容器類分類Qt的容器類是基于模板的類,分為順序容器(sequentialcontainers)類和關(guān)聯(lián)容器(associativecontainers)類兩種類型。順序容器中的數(shù)據(jù)按順序依次線性存儲(chǔ),而關(guān)聯(lián)容器中的數(shù)據(jù)則以(鍵/值)對(duì)方式進(jìn)行存儲(chǔ)。Qt6.2的順序容器類有QList、Qstack和QQueue,關(guān)聯(lián)容器類有QMap、QMultiMap、QHash、QMultiHash和QSet。2、順序容器類Qt6.2的順序容器類有QList、Qstack和QQueue。(1)QList類QList是目前最常用的容器類,雖然它是以數(shù)組列表(arraylist)的形式實(shí)現(xiàn)的,但是在其前或后添加數(shù)據(jù)速度非???,QList以下標(biāo)索引的方式對(duì)數(shù)據(jù)項(xiàng)進(jìn)行訪問(wèn)。例如:(2)QStack類Qstack是提供類似于堆棧的后進(jìn)先出(LIFO)操作的容器類,它繼承自QList,可以使用QList類的成員函數(shù)對(duì)其操作。除了QList類的成員函數(shù)之外,QStack還提供了另外3個(gè)操作函數(shù),即push()、pop()和top(),來(lái)對(duì)容器進(jìn)行進(jìn)棧、出棧和獲取棧頂數(shù)據(jù)項(xiàng)的操作。例如:(3)QQueue類Qqueue是提供類似于隊(duì)列先進(jìn)先出(FIFO)操作的容器類,它也是QList的子類。除了QList類的成員函數(shù)之外,其主要的操作函數(shù)有enqueue()、dequeue()和head()。例如:3、關(guān)聯(lián)容器類Qt6.2的關(guān)聯(lián)容器類有QMap、QMultiMap、QHash、QMultiHash
和QSet。(1)QMap類QMap<Key,T>提供了一個(gè)字典(關(guān)聯(lián)數(shù)組),一個(gè)鍵映射到一個(gè)值。也就是,提供了一個(gè)從類型為Key的鍵到類型為T的值的映射。通常情況下,QMap存儲(chǔ)的數(shù)據(jù)形式是一對(duì)一,并且按照鍵Key的次序存儲(chǔ)數(shù)據(jù)。(2)QMultiMap類該類是用于處理值映射的便利類。所謂多值映射,就是一個(gè)鍵可以對(duì)應(yīng)多個(gè)值。例如:(3)QHash類QHash類是基于散列表來(lái)實(shí)現(xiàn)字典功能的模板類,其存儲(chǔ)的鍵/值對(duì)具有非??斓牟檎宜俣取T擃惻cQMap類的功能和用法類似。(4)QMultiHash類該類是用于處理多值映射的便利類,其用法與QMultiMap類相似。QMultiHash類繼承了QHash類的功能并對(duì)其進(jìn)行擴(kuò)展,使其比QHash類更適合存儲(chǔ)多值散列。(5)QSet類該類是基于散列表的集合模板類,它存儲(chǔ)數(shù)據(jù)的順序是不確定的,查找值的速度非???。其實(shí),QSet類的內(nèi)部就是用QHash實(shí)現(xiàn)的。4、容器的遍歷遍歷一個(gè)容器可以使用迭代器(iterators)或foreach關(guān)鍵字來(lái)完成。迭代器提供了一個(gè)統(tǒng)一的方法來(lái)訪問(wèn)容器中的數(shù)據(jù)項(xiàng)。Qt的容器類提供了兩種類型的迭代器,即Java風(fēng)格的迭代器和STL風(fēng)格的迭代器。如果只是想按順序遍歷一個(gè)容器中的數(shù)據(jù)項(xiàng),則可以使用Qt的foreach關(guān)鍵字。(1)Java風(fēng)格迭代器對(duì)于每個(gè)容器類,有兩個(gè)Java風(fēng)格的迭代器,一個(gè)用于只讀操作,一個(gè)用于讀寫(xiě)操作。如表2.14所示。(2)STL風(fēng)格迭代器STL迭代器與Qt和STL的原生算法兼容,并且進(jìn)行了速度優(yōu)化。(3)foreach關(guān)鍵字在Qt中預(yù)定義了一個(gè)名為foreach的關(guān)鍵字,用于對(duì)容器進(jìn)行遍歷。實(shí)際上,Qt中的foreach是一個(gè)宏,其語(yǔ)法格式如下:foreach(variable,container)其中,參數(shù)variable為當(dāng)前數(shù)據(jù)項(xiàng);container為容器。例如:課后作業(yè)思政本章結(jié)束Qt6.2/C++程序設(shè)計(jì)與桌面應(yīng)用開(kāi)發(fā)21世紀(jì)高等學(xué)校計(jì)算機(jī)類課程創(chuàng)新規(guī)劃教材–微課視頻版教材目錄第1章初識(shí)Qt框架第2章Qt開(kāi)發(fā)基礎(chǔ)第3章界面設(shè)計(jì)組件第4章主框架窗口第5章對(duì)話框設(shè)計(jì)第6章事件系統(tǒng)第7章文件與數(shù)據(jù)庫(kù)第8章模型/視圖結(jié)構(gòu)第9章圖形繪制第10章多媒體編程第11章網(wǎng)絡(luò)編程第12章進(jìn)程與線程教材目錄第3章界面設(shè)計(jì)組件3.1基本窗口3.2常用組件3.3布局管理3.1基本窗口Qt應(yīng)用程序?qū)儆贕UI程序,其用戶界面一般都包含有一個(gè)頂層的主窗口和多個(gè)子窗口。在Qt中,應(yīng)用程序的主窗口默認(rèn)有3種基本類型,即QMainWindow、QWidget和QDialog。本節(jié)介紹QWidget類型的基本窗口。3.1.1QWidget類QWidget類是Qt中所有用戶界面組件的基類,它繼承于QObject類和QPaintDevice類。其中,QObject類是所有支持Qt對(duì)象模型的基類,QPaintDevice類是所有可以繪制的對(duì)象的基類。所以,Qt的所有界面組件都具有信號(hào)/槽功能,也都能夠可視化地顯示自己。QWidget類屬于Qt的Widgets模塊,其部分繼承關(guān)系如圖3.1所示。下面是QWidget的直接子類。作為Qt界面組件的基類,QWidget提供了大量的通用方法,來(lái)實(shí)現(xiàn)組件的顯示、關(guān)閉、參數(shù)傳遞、屬性設(shè)置以及事件處理等一系列基本操作。表3.1所示給出了QWidget類的部分成員函數(shù)及功能。在Qt中,通過(guò)直接實(shí)例化QWidget類創(chuàng)建的基本窗口一般都是作為容器來(lái)使用的,其中包含了很多不同功能的QWidget類的子類對(duì)象,例如QLabel、QPushButton等,因此可以使用QWidget類的成員函數(shù)來(lái)完成大部分的用戶界面設(shè)計(jì)工作。實(shí)際上,使用Qt編寫(xiě)應(yīng)用程序,就是要熟練掌握Qt類庫(kù)里各種用于界面設(shè)計(jì)或其他功能的類的使用方法。例如下面的示例代碼:3.1.2簡(jiǎn)單實(shí)例QWidget類的成員函數(shù)非常多,除了表3.1中列出的部分非繼承的public訪問(wèn)權(quán)限函數(shù)外,還包括它自身的staticpublic和protected權(quán)限的函數(shù),以及從基類Qobject和QPaintDevice繼承下來(lái)的函數(shù)。QWidget類的protected成員函數(shù)大部分是用于事件處理的虛函數(shù),如下圖所示?!纠?.1】編寫(xiě)一個(gè)基于QWidget類的Qt應(yīng)用程序。程序運(yùn)行后,單擊窗口中的按鈕,更改應(yīng)用程序主窗口標(biāo)題,并給出相應(yīng)的提示信息。程序初始界面如圖3.2所示。(1)打開(kāi)QtCreator集成開(kāi)發(fā)環(huán)境,創(chuàng)建一個(gè)基于QWidget類的Qt應(yīng)用程序。項(xiàng)目名稱為examp3_1。(2)雙擊項(xiàng)目視圖中的widget.ui界面文件,打開(kāi)Qt界面設(shè)計(jì)器,對(duì)應(yīng)用程序主窗口界面進(jìn)行設(shè)計(jì)。如圖3.3所示。(3)將主窗口設(shè)置為垂直布局。如圖3.4所示。(4)設(shè)置主窗口及按鈕組件的信號(hào)/槽功能。(5)在Widget類構(gòu)造函數(shù)中添加代碼,將主窗口中的提示信息設(shè)置為紅色。如下所示。ui->label->setStyleSheet(tr("color:red"));(6)構(gòu)建并運(yùn)行程序。3.2常用組件Qt提供了大量的窗體組件,它們按照功能不同被分為按鈕、輸入、顯示、瀏覽等不同的類型。Qt應(yīng)用程序的界面設(shè)計(jì),主要是程序主窗口中組件的設(shè)計(jì),包括組件的布局和數(shù)據(jù)傳遞兩個(gè)方面。3.2.1按鈕組件按鈕組件是用戶使用鼠標(biāo)與應(yīng)用程序交互的圖形界面。Qt的按鈕類組件主要有:普通按鈕、工具欄按鈕、單選按鈕、復(fù)選按鈕等,其外觀和英文名稱如圖3.6所示。1、普通按鈕普通按鈕也稱為下壓按鈕,它所對(duì)應(yīng)的C++類為QPushButtonQPushButton類是通過(guò)多次繼承而得到的,擁有數(shù)量眾多的成員函數(shù),包括繼承下來(lái)的基類成員函數(shù)以及自己特有的成員函數(shù)。下面是一段示例代碼:2、工具欄按鈕工具欄按鈕就是應(yīng)用程序工具欄上使用的按鈕組件,它一般與某個(gè)菜單命令相關(guān)聯(lián)。Qt的工具欄按鈕對(duì)應(yīng)的C++類為QToolButton,它與QPushButton一樣繼承自QAbstractButton類。由于QToolButton按鈕一般在工具欄上使用,并且涉及到Qt中的Action(動(dòng)作)概念,把它放在后續(xù)的章節(jié)中與菜單欄、工具欄一起介紹。3、單選按鈕單選按鈕一般用于在眾多選項(xiàng)中單獨(dú)選擇某一項(xiàng),它對(duì)應(yīng)的C++類為QRadioButton單選按鈕一般放置在QGroupBox容器中,以便對(duì)其進(jìn)行分組。下面是一段單選按鈕設(shè)計(jì)的示例代碼:4、復(fù)選按鈕復(fù)選按鈕用于在眾多的選項(xiàng)中同時(shí)選擇多項(xiàng),它對(duì)應(yīng)的C++類為QCheckBox下面是一段復(fù)選按鈕設(shè)計(jì)的示例代碼:3.2.2輸入組件輸入類組件用于應(yīng)用程序與用戶的交互,主要包括組合框、字體選擇框、行編輯器、文本編輯器、數(shù)字選擇框(自旋盒)、時(shí)間編輯器、日期編輯器、撥號(hào)器、滾動(dòng)條和滑動(dòng)條等,其外觀和英文名稱如圖所示。1、組合框組合框又稱為下拉列表框,用于通過(guò)選擇來(lái)輸入數(shù)據(jù)。它對(duì)應(yīng)的C++類為QComboBox。下面是一段組合框設(shè)計(jì)的示例代碼:2、行編輯器行編輯器組件是一個(gè)單行的文本編輯器,允許用戶輸入和編輯單行的純文本內(nèi)容。它提供了一系列有用功能,包括撤銷、恢復(fù)、剪切和拖放等操作。行編輯器組件對(duì)應(yīng)的C++類為QLineEdit,該類是QWidget的直接子類?!纠?.2】行編輯器QLineEdit簡(jiǎn)單示例。程序運(yùn)行結(jié)果如圖所示。(1)打開(kāi)QtCreator集成開(kāi)發(fā)環(huán)境,創(chuàng)建一個(gè)基于QWidget類的Qt應(yīng)用程序,項(xiàng)目名稱為examp3_2。在項(xiàng)目創(chuàng)建過(guò)程中,取消自動(dòng)生成界面文件選項(xiàng)。(2)雙擊項(xiàng)目視圖中的widget.h頭文件,為Widget類添加4個(gè)QLineEdit類型的行編輯器組件對(duì)象指針lineEdit1~4和4個(gè)QLabel類型的標(biāo)簽組件對(duì)象指針label1~4;為Widget類添加一個(gè)名為labelText()的槽函數(shù)。(3)雙擊打開(kāi)項(xiàng)目的widget.cpp文件,在Widget類的構(gòu)造函數(shù)中添加代碼。(4)在widget.cpp文件中添加槽函數(shù)labelTex()的實(shí)現(xiàn)代碼。(5)構(gòu)建并運(yùn)行程序。本程序示例了4種類型的行編輯器組件,在圖3.12的主窗口中,從上至下依次為正常顯示模式的行編輯器、密碼顯示模式的行編輯器、具有輸入驗(yàn)證功能的行編輯器和具有自動(dòng)補(bǔ)全功能的行編輯器。3、數(shù)字選擇框數(shù)字選擇框又稱為自旋盒,主要用于數(shù)字的輸入和顯示。它對(duì)應(yīng)的C++類有QSpinBox、QDoubleSpinBox和QDateTimeEdit等,其繼承關(guān)系如圖3.1所示。4、移動(dòng)型組件移動(dòng)型組件主要用于輸入數(shù)字,改變組件中的可移動(dòng)部件的位置從而實(shí)現(xiàn)數(shù)字的輸入。它對(duì)應(yīng)的C++類有QDial、QScrollBar和QSlider等,其繼承關(guān)系如圖3.1所示。3.2.3顯示組件顯示類組件用于應(yīng)用程序的信息展示,主要包括標(biāo)簽、文本瀏覽器、圖形視圖、日歷、液晶數(shù)字、進(jìn)度條、水平線、垂直線、開(kāi)放式圖形庫(kù)工具和嵌入QML工具等,其外觀和英文名稱如圖3.17所示。1、標(biāo)簽標(biāo)簽組件用于顯示簡(jiǎn)單的文本或位圖。它對(duì)應(yīng)的C++類為QLabel2、日歷組件日歷組件用于選擇日期數(shù)據(jù),它所對(duì)應(yīng)的C++類為QCalendarWidget該類是QWidget類的直接子類,它沒(méi)有被其它類繼承。其外觀效果如圖3.18所示。3、LCD數(shù)字顯示框LCD數(shù)字顯示框組件可以讓數(shù)碼顯示與液晶數(shù)字一樣的效果,它對(duì)應(yīng)的C++類為QLCDNumber其外觀效果如圖3.19所示。4、進(jìn)度條組件進(jìn)度條組件用于顯示一件比較耗時(shí)的事情的完成情況。它對(duì)應(yīng)的C++類為QProgressBar其外觀效果如圖3.20所示。3.2.4瀏覽組件項(xiàng)目瀏覽類組件用于應(yīng)用程序的信息展示。它分為兩種類型,一類是基于Qt的模型/視圖的組件,包括列表視圖、樹(shù)視圖、表視圖和列視圖等;另一類是基于數(shù)據(jù)項(xiàng)的組件,包括列表部件、樹(shù)形部件和表部件。瀏覽類組件的外觀和英文名稱如圖3.21所示。項(xiàng)目瀏覽類組件所對(duì)應(yīng)的C++類如圖所示。1、列表組件列表組件用于以列表的形式顯示信息,它對(duì)應(yīng)的C++類為QListView、QListWidget
和QUndoView下面給出一個(gè)QListWidget的簡(jiǎn)單應(yīng)用實(shí)例?!纠?.3】示例QListWidget列表組件的使用。程序運(yùn)行結(jié)果如圖3.23所示。(1)打開(kāi)QtCreator集成開(kāi)發(fā)環(huán)境,創(chuàng)建一個(gè)基于QWidget類的Qt應(yīng)用程序,項(xiàng)目名稱為examp3_3。(2)雙擊項(xiàng)目視圖中的widget.ui界面文件,打開(kāi)Qt界面設(shè)計(jì)器,對(duì)應(yīng)用程序主窗口界面進(jìn)行設(shè)計(jì)。如圖3.23所示。(3)在界面設(shè)計(jì)器中分別選擇6個(gè)按鈕組件,為它們添加clicked信號(hào)槽函數(shù)。(4)為類Widget添加一個(gè)私有的成員函數(shù)initListWidget(),用于初始化列表框組件。(5)為上述第(3)步中添加的槽函數(shù)編寫(xiě)代碼,實(shí)現(xiàn)相應(yīng)的操作功能。(6)構(gòu)建并運(yùn)行程序。單擊主窗口中的“添加”按鈕,會(huì)在列表框的末尾增加一個(gè)新項(xiàng),如圖3.24所示;雙擊新增加的子項(xiàng),可以編輯其名稱,如圖3.25所示。2、樹(shù)形組件樹(shù)形組件用于表現(xiàn)具有樹(shù)狀層次關(guān)系的數(shù)據(jù),該組件的每一項(xiàng)均可添加位圖或文字,可響應(yīng)單擊、雙擊、選項(xiàng)改變、樹(shù)狀顯示擴(kuò)展、收縮等信號(hào)。它所對(duì)應(yīng)的C++類有QTreeView
和QTreeWidget
下面給出一個(gè)QTreeWidget
的簡(jiǎn)單應(yīng)用實(shí)例?!纠?.4】示例QTreeWidget列表組件的使用。程序運(yùn)行結(jié)果如圖3.26所示。(1)打開(kāi)QtCreator集成開(kāi)發(fā)環(huán)境,創(chuàng)建一個(gè)基于QWidget類的Qt應(yīng)用程序,項(xiàng)目名稱為examp3_4。(2)雙擊項(xiàng)目視圖中的widget.ui界面文件,打開(kāi)Qt界面設(shè)計(jì)器,對(duì)應(yīng)用程序主窗口界面進(jìn)行設(shè)計(jì)。(3)在界面設(shè)計(jì)器中分別選擇3個(gè)按鈕組件,為它們添加clicked信號(hào)槽函數(shù)。(4)為類Widget添加一個(gè)私有的成員函數(shù)initTreeWidget(),用于初始化主窗口中的樹(shù)形組件。代碼如下:(5)為上述第(3)步中添加的槽函數(shù)編寫(xiě)代碼,實(shí)現(xiàn)相應(yīng)的操作功能。代碼如下:(6)構(gòu)建并運(yùn)行程序。單擊主窗口中的“添加章”按鈕,會(huì)在樹(shù)形顯示框的末尾增加一個(gè)新的“章”項(xiàng);選擇“章”項(xiàng),單擊“添加節(jié)”按鈕,可以為該章添加“節(jié)”子項(xiàng),如圖3.27所示。3、表格組件表格組件用于以標(biāo)準(zhǔn)表格的形式顯示信息。它所對(duì)應(yīng)的C++類有QTableView
和QTableWidget下面給出一個(gè)QTableWidget
的簡(jiǎn)單應(yīng)用實(shí)例?!纠?.5】示例QTableWidget表格組件的使用。程序運(yùn)行結(jié)果如圖3.28所示。(1)打開(kāi)QtCreator集成開(kāi)發(fā)環(huán)境,創(chuàng)建一個(gè)基于QWidget類的Qt應(yīng)用程序,項(xiàng)目名稱為examp3_5。(2)雙擊項(xiàng)目視圖中的widget.ui界面文件,打開(kāi)Qt界面設(shè)計(jì)器,對(duì)應(yīng)用程序主窗口界面進(jìn)行設(shè)計(jì)。(3)在界面設(shè)計(jì)器中分別選擇3個(gè)按鈕組件,為它們添加clicked信號(hào)槽函數(shù)。(4)為類Widget添加一個(gè)私有的成員函數(shù)initTableWidget(),用于初始化主窗口中的樹(shù)形組件。代碼如下:(5)為上述第(3)步中添加的槽函數(shù)編寫(xiě)代碼,實(shí)現(xiàn)相應(yīng)的操作功能。代碼如下:(6)構(gòu)建并運(yùn)行程序。單擊主窗口中的“添加行”按鈕,會(huì)在表格末尾增加一個(gè)新的行;單擊“插入行”按鈕,可以在表格的中間插入一個(gè)新的行,如圖3.29所示。3.2.5組件容器容器類組件用于包含其他組件或容器,以便對(duì)應(yīng)用程序界面組件進(jìn)行分類管理。主要包括組框、滾動(dòng)區(qū)域、工具箱、選項(xiàng)卡、堆疊部件、幀部件、小部件、MDI區(qū)域、??看翱诓考头庋bFlash的ActiveX組件等。其外觀和英文名稱如圖3.30所示。1、組框組框組件提供一個(gè)框架、頂部的標(biāo)題、鍵盤(pán)快捷鍵,并在其內(nèi)部顯示各種其他部件。鍵盤(pán)快捷鍵用于將鍵盤(pán)焦點(diǎn)移動(dòng)到組框的某個(gè)子窗口上。組框組件對(duì)應(yīng)的C++類為QGroupBox2、工具箱工具箱組件是一個(gè)小窗口部件,它將一列選項(xiàng)卡顯示在另一列選項(xiàng)卡的上方,當(dāng)前項(xiàng)顯示在當(dāng)前選項(xiàng)卡的下方。每個(gè)選項(xiàng)卡在選項(xiàng)卡列中都有一個(gè)索引位置,選項(xiàng)卡的每一項(xiàng)都是一個(gè)QWidget子窗口。工具箱組件對(duì)應(yīng)的C++類為QToolBox3、選項(xiàng)卡選項(xiàng)卡組件提供一個(gè)選項(xiàng)卡欄和一個(gè)“頁(yè)面區(qū)域”,用于顯示與每個(gè)選項(xiàng)卡相關(guān)的頁(yè)面。默認(rèn)情況下,選項(xiàng)卡欄顯示在頁(yè)面區(qū)域上方。每個(gè)選項(xiàng)卡都與不同的小部件(稱為頁(yè)面)相關(guān)聯(lián)。頁(yè)面區(qū)域中僅顯示當(dāng)前頁(yè)面,所有其他頁(yè)面都被隱藏。用戶可以通過(guò)單擊選項(xiàng)卡或按Alt+字母快捷鍵(如果有的話)來(lái)顯示不同的頁(yè)面。選項(xiàng)卡組件對(duì)應(yīng)的C++類為QTabWidget【例3.6】示例QTabWidget選項(xiàng)卡組件的使用。程序運(yùn)行初始界面如圖3.31所示。(1)打開(kāi)QtCreator集成開(kāi)發(fā)環(huán)境,創(chuàng)建一個(gè)基于QWidget類的Qt應(yīng)用程序,項(xiàng)目名稱為examp3_6。(2)雙擊項(xiàng)目視圖中的widget.ui界面文件,打開(kāi)Qt界面設(shè)計(jì)器,對(duì)應(yīng)用程序主窗口界面進(jìn)行設(shè)計(jì),結(jié)果如圖3.31所示。(3)為列表組件listWidget0和listWidget1添加itemSelectionChanged()信號(hào)函數(shù),并編寫(xiě)代碼。如下所示。(4)準(zhǔn)備測(cè)試數(shù)據(jù)并初始化tabWidget和listWidget0等組件。(5)構(gòu)建并運(yùn)行程序程序運(yùn)行后,單擊“省”頁(yè)面中的“湖北省”,隨即激活“市”頁(yè)面;接著單擊“市”頁(yè)面中的“武漢市”,激活“區(qū)”頁(yè)面。測(cè)試結(jié)果如圖3.32所示。3.2.6布局組件布局類組件用于用戶界面的布局管理,主要包括垂直布局、水平布局、風(fēng)格布局、表單布局和水平間隔、垂直間隔等。其外觀和英文名稱如圖3.33所示。3.3布局管理Qt應(yīng)用程序中的眾多可視化部件,共同構(gòu)建起程序的GUI界面。Qt通過(guò)“布局管理器”來(lái)對(duì)GUI界面上部件的布局進(jìn)行管理。3.3.1Qlayout類Qt中主要提供了QLayout類及其子類來(lái)作為布局管理器,使用它們可以實(shí)現(xiàn)基本的布局管理功能。QLayout及其子類的繼承關(guān)系如圖3.34所示。3.3.2基本布局基本布局管理器QBoxLayout包括兩種類型,一種是水平布局管理器QHBoxLayout,另一種是垂直布局管理器QVBoxLayout。水平布局管理將窗口中的組件配置為橫向一行,而垂直布局管理器則將窗口中的組件配置為垂直一列。QBoxLayout類繼承和定義了很多成員函數(shù),其中addWidget()和insertWidget()是兩個(gè)非常重要的函數(shù),通過(guò)它們可以向布局中增加窗口組件。1、水平布局基本的水平布局管理功能由QHBoxLayout類來(lái)實(shí)現(xiàn)。【例3.7】編寫(xiě)一個(gè)Qt應(yīng)用程序,示例水平布局管理器QHBoxLayout的使用。(1)打開(kāi)QtCreator集成開(kāi)發(fā)環(huán)境,創(chuàng)建一個(gè)名為examp3_7的基于QWidget類的應(yīng)用程序。(2)打開(kāi)widget.h頭文件,在Widget類中添加代碼,定義2個(gè)QLabel組件對(duì)象指針、2個(gè)QLineEdit組件對(duì)象指針和一個(gè)QHBoxLayout水平布局管理器對(duì)象指針。代碼如下:(3)打開(kāi)widget.cpp文件,在Widget類的構(gòu)造函數(shù)中添加代碼,初始化第(2)步中新增的對(duì)象指針。代碼如下:這里先不使用布局管理器,直接使用QWidget的setGeometry()函數(shù)設(shè)置窗口中組件的位置及大小。運(yùn)行結(jié)果如圖3.35所示。(4)在Widget類的構(gòu)造函數(shù)中繼續(xù)添加代碼,用QHBoxLayout水平布局管理器對(duì)窗口中的組件進(jìn)行布局管理。代碼如下:(5)再次構(gòu)建并運(yùn)行程序,結(jié)果如圖3.36所示。2、垂直布局基本的垂直布局管理功能由QVBoxLayout對(duì)象來(lái)完成。下面給出一個(gè)簡(jiǎn)單實(shí)例,將例3.7中程序主窗口中的組件更改為垂直布局方式?!纠?.8】編寫(xiě)一個(gè)Qt應(yīng)用程序,示例垂直布局管理器QVBoxLayout的使用。(1)復(fù)制例3.7中的項(xiàng)目examp3_7,將項(xiàng)目名修改為examp3_8。(2)啟動(dòng)QtCreator集成開(kāi)發(fā)環(huán)境,打開(kāi)項(xiàng)目examp3_8。在Widget類中添加一個(gè)私有的QVBoxLayout類型的指針變量vLayout。代碼如下:(3)修改Widget類的構(gòu)成函數(shù)中的代碼,實(shí)現(xiàn)窗口中組件的垂直布局。代碼如下:(4)構(gòu)建并運(yùn)行程序,得到如圖3.37所示的結(jié)果。3.3.3表單布局表單布局就是將窗口中的組件按表單形式進(jìn)行排列。表單一般由兩個(gè)列組成,第一列用于顯示信息,起提示作用,一般稱為label域;第二列用于數(shù)據(jù)輸入,一般稱為field域。表單就是由很多l(xiāng)abel域和field域兩項(xiàng)內(nèi)容組成的行布局。表單布局管理功能由QFormLayout對(duì)象來(lái)實(shí)現(xiàn)。下面給出一個(gè)簡(jiǎn)單實(shí)例,
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 衡陽(yáng)師范學(xué)院《馬克思主義哲學(xué)(下)》2023-2024學(xué)年第二學(xué)期期末試卷
- 電子科技大學(xué)中山學(xué)院《車輛建模與仿真》2023-2024學(xué)年第二學(xué)期期末試卷
- 甘肅省蘭州市第六十三中學(xué)2025屆高三3月期初測(cè)試化學(xué)試題含解析
- 武漢科技大學(xué)《數(shù)字化教學(xué)資源設(shè)計(jì)與開(kāi)發(fā)(C)》2023-2024學(xué)年第二學(xué)期期末試卷
- 許昌職業(yè)技術(shù)學(xué)院《植物保健與和諧植保》2023-2024學(xué)年第二學(xué)期期末試卷
- 湖南吉利汽車職業(yè)技術(shù)學(xué)院《日本文學(xué)》2023-2024學(xué)年第二學(xué)期期末試卷
- 工程造價(jià)領(lǐng)域發(fā)展趨勢(shì)
- 工程教育基礎(chǔ)
- 廠房強(qiáng)化護(hù)欄施工方案
- 屋面設(shè)備基礎(chǔ)施工方案
- 2019年10月自考03706思想道德修養(yǎng)與法律基礎(chǔ)試題及答案含解析
- 無(wú)人機(jī)操控技術(shù) 課件全套 項(xiàng)目1-6 緒論-無(wú)人機(jī)自動(dòng)機(jī)場(chǎng)
- 江蘇紅豆實(shí)業(yè)股份有限公司償債能力分析
- 四川省2023年普通高等學(xué)校高職教育單獨(dú)招生文化考試(中職類)數(shù)學(xué)試題(原卷版)
- 水力機(jī)械原理與設(shè)計(jì)課件
- 江蘇電子信息職業(yè)學(xué)院?jiǎn)握新殬I(yè)技能測(cè)試參考試題庫(kù)(含答案)
- 充電樁采購(gòu)安裝投標(biāo)方案(技術(shù)方案)
- 7.1開(kāi)放是當(dāng)代中國(guó)的鮮明標(biāo)識(shí)課件-高中政治選擇性必修一當(dāng)代國(guó)際政治與經(jīng)濟(jì)(1)2
- 2024年浙江首考英語(yǔ)聽(tīng)力原文解惑課件
- 民族團(tuán)結(jié)教材
- 煤礦頂板管理技術(shù)培訓(xùn)課件
評(píng)論
0/150
提交評(píng)論