




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
QT5開發(fā)及實(shí)例(第5版)第1章Qt概述——什么是Qt01Qt的產(chǎn)生和發(fā)展Qt的產(chǎn)生和發(fā)展2008年,諾基亞公司從奇趣收購了Qt,并從2009年5月發(fā)布的Qt4.5起開放源代碼。2011年,Digia公司(芬蘭的一家IT服務(wù)公司)從諾基亞收購了Qt的商業(yè)版權(quán)。2012年8月9日,諾基亞宣布將Qt軟件業(yè)務(wù)正式出售給Digia。2013年7月3日,Digia公司發(fā)布Qt5.1并于次年4月配套推出了Qt跨平臺(tái)的集成開發(fā)環(huán)境QtCreator3.1.0。2014年9月16日,Digia成立了一個(gè)名為TheQtCompany的全資子公司,以進(jìn)一步推動(dòng)Qt產(chǎn)品的開發(fā)和市場(chǎng)擴(kuò)張,并建立起全新的Qt產(chǎn)品網(wǎng)站www.qt.io,該網(wǎng)站將Qt的商業(yè)業(yè)務(wù)和開源社區(qū)統(tǒng)一到同一個(gè)在線渠道之中。02Qt5.15與Qt6Qt5.15與Qt6隨著互聯(lián)網(wǎng)邁入“云”時(shí)代及物聯(lián)網(wǎng)的興起,TheQtCompany緊跟潮流于2020年底發(fā)布了面向未來生產(chǎn)力平臺(tái)的Qt6。因Digia志在同時(shí)成為桌面、嵌入式、移動(dòng)互聯(lián)網(wǎng)等眾多領(lǐng)域的開拓者,對(duì)Qt6進(jìn)行了“大刀闊斧”的重構(gòu),將原Qt5的大量傳統(tǒng)模塊和庫從Qt中剔除,從零開始基于最新的技術(shù)重新研發(fā)它們的替代品,并制定了雄心勃勃的計(jì)劃,但是這么一來卻使得原來基于Qt5開發(fā)的很多軟件功能在Qt6上暫時(shí)無法實(shí)現(xiàn)(因官方與之對(duì)應(yīng)的新技術(shù)模塊/庫尚未來得及做出來),為保持兼容和維護(hù)Qt生態(tài)圈的穩(wěn)定,官方在發(fā)布Qt6的同時(shí)也推出了Qt5.15,它是一個(gè)長支持(LTS)版本,可看作是Qt5系列的“封筆之作”。QT5開發(fā)及實(shí)例(第5版)第1章Qt概述——Qt5.15的安裝01下載Qt在線安裝器和申請(qǐng)免費(fèi)賬號(hào)下載Qt在線安裝器和申請(qǐng)免費(fèi)賬號(hào)訪問Qt官網(wǎng)https://www.qt.io,點(diǎn)主頁右上角
按鈕進(jìn)入“GetQt&QA”頁,找到“TryQtFrameworkandTools”版塊,如圖1.1所示,單擊“DownloadQt”按鈕,彈出Qt申請(qǐng)免費(fèi)賬號(hào)頁,如圖1.2所示。下載Qt在線安裝器和申請(qǐng)免費(fèi)賬號(hào)圖1.2申請(qǐng)免費(fèi)賬號(hào)下載Qt在線安裝器和申請(qǐng)免費(fèi)賬號(hào)根據(jù)頁面欄目填寫信息,填寫完單擊底部“Submit”按鈕,如果填寫的信息形式上沒問題,系統(tǒng)首先向用戶提供的電話(筆者的是+8617714319***)發(fā)6位短信,在隨后出現(xiàn)的驗(yàn)證對(duì)話框輸入短信驗(yàn)證碼,驗(yàn)證通過后,輸入賬號(hào)密碼和對(duì)密碼再次輸入確認(rèn),系統(tǒng)會(huì)給用戶提供的電子郵箱發(fā)送郵件。完成后顯示頁面如圖。下載Qt在線安裝器和申請(qǐng)免費(fèi)賬號(hào)該頁面包含兩個(gè)方面信息:(1)提供在線安裝器下載。單擊“here”超鏈接,系統(tǒng)自動(dòng)識(shí)別當(dāng)前操作者使用的計(jì)算機(jī)操作系統(tǒng),并提供與之匹配的安裝器,用戶直接確認(rèn)下載即可。(2)提示用戶根據(jù)Qt官方發(fā)送的郵件鏈接盡快登錄驗(yàn)證,因?yàn)樵撴溄佑袝r(shí)效,使用后不能再用。進(jìn)入該鏈接網(wǎng)頁,如圖完成Qt賬號(hào)登錄。
02安裝過程安裝過程安裝前要確保計(jì)算機(jī)是處于聯(lián)網(wǎng)狀態(tài)。(1)雙擊下載的安裝器文件,啟動(dòng)向?qū)?,出現(xiàn)如圖界面,要求輸入Qt賬號(hào)(也就是剛剛申請(qǐng)的免費(fèi)賬號(hào)),輸入完單擊“下一步”按鈕。(2)接下來出現(xiàn)“開源義務(wù)”頁,勾選“我已閱讀并同意使用開源Qt的條款和條件”和“我是個(gè)人用戶,我不為任何公司使用Qt”,單擊“下一步”按鈕。安裝過程(3)在“安裝程序-Qt”頁直接單擊“下一步”按鈕。安裝器自動(dòng)獲取遠(yuǎn)程Qt安裝所需的元信息,進(jìn)入“ContributetoQtDevelopment”頁顯示提示信息,用戶可選擇向Qt官方發(fā)送(或不發(fā)送)有關(guān)自己Qt使用的統(tǒng)計(jì)信息。單擊“下一步”按鈕。(4)在“安裝文件夾”頁顯示如圖。安裝過程(5)在“選擇組件”頁選擇要安裝的組件,如圖。因?yàn)橐惭b的是Qt5.15,我們?cè)诮缑嬷醒雲(yún)^(qū)樹狀視圖的“Qt”節(jié)點(diǎn)下找到“Qt5.15.2”項(xiàng),展開,看到其包含的所有組件,只須選擇其中的部分進(jìn)行安裝。安裝過程再選擇其他模塊,有幾個(gè)模塊在本書實(shí)例開發(fā)中可能會(huì)用到,所以建議大家在此一并選擇裝上,如圖是筆者安裝Qt5.15時(shí)的勾選項(xiàng),供參考。(6)在“許可協(xié)議”頁,選中“Ihavereadandagreetothetermscontainedinthelicenseagreements.”接受許可協(xié)議,單擊“下一步”按鈕。(7)在“開始菜單快捷方式”頁可命名Qt啟動(dòng)菜單名,這里保持默認(rèn)名,單擊“下一步”按鈕。(8)在“準(zhǔn)備安裝”頁顯示需要的磁盤空間,點(diǎn)“安裝”按鈕,開始在線安裝Qt5.15。安裝過程安裝完成的界面如圖,單擊“完成”按鈕結(jié)束安裝。系統(tǒng)會(huì)自行啟動(dòng)QtCreator。03運(yùn)行QtCreator運(yùn)行QtCreatorQtCreator啟動(dòng)后進(jìn)入初始界面,如圖。04Qt5.15開發(fā)環(huán)境Qt5.15開發(fā)環(huán)境在Qt程序開發(fā)過程中,可以通過Qt的GUI界面設(shè)計(jì)器(QtDesigner)進(jìn)行程序界面的繪制和布局,QtDesigner設(shè)計(jì)環(huán)境如圖。Qt5.15開發(fā)環(huán)境
對(duì)象檢查器(ObjectInspector):以兩列表格的形式列出窗體中每個(gè)控件的對(duì)象名及所屬類。初始窗體上尚未放置任何控件時(shí),僅有窗體自身的一個(gè)條目,可看到它的類型為QDialog(對(duì)話框)。
屬性編輯器(PropertyEditor):以兩列表格的形式顯示當(dāng)前窗體或其上被選中控件的屬性和值,可根據(jù)設(shè)計(jì)需要在其中修改屬性值。
Action編輯器(ActionEditor):用于編輯菜單/工具欄的選項(xiàng)動(dòng)作。
信號(hào)和槽編輯器(SignalsandSlotsEditor):列出了窗體界面上所有的信號(hào)/槽關(guān)聯(lián)。Qt5.15開發(fā)環(huán)境設(shè)計(jì)區(qū)窗體的頂部有一系列工具按鈕可用于在設(shè)計(jì)界面時(shí)切換編輯模式,Qt支持四種編輯模式,如圖。Qt5.15開發(fā)環(huán)境各模式的用途簡介如下。
編輯控件(EditWidgets):這是默認(rèn)的模式,可以在窗體上拖曳放置控件并設(shè)置它們的屬性和外觀。
編輯信號(hào)/槽(EditSignals/Slots):此模式下可以為窗體上的控件關(guān)聯(lián)系統(tǒng)中已有的信號(hào)和槽。
編輯伙伴(EditBuddies):可以建立QLabel標(biāo)簽與其他類型控件的伙伴關(guān)系,即當(dāng)用戶激活標(biāo)簽的快捷鍵時(shí),鼠標(biāo)/鍵盤的焦點(diǎn)會(huì)轉(zhuǎn)移到它的伙伴控件上。Qt中只有QLabel標(biāo)簽對(duì)象才可以有伙伴控件,也只有該QLabel對(duì)象具有快捷鍵(在顯示文本的某個(gè)字符前面添加一個(gè)前綴“&”就可以定義快捷鍵)時(shí),伙伴關(guān)系才有效。例如:QLineEdit*leAge=newQLineEdit(this);QLabel*lbAge=newQLabel("&Age",this);lbAge->setBuddy(leAge);
編輯Tab順序(EditTabOrder):可以設(shè)置Tab鍵在窗體控件間的焦點(diǎn)順序。QT5開發(fā)及實(shí)例(第5版)第1章Qt概述——Qt5開發(fā)入門實(shí)例Qt5開發(fā)入門實(shí)例當(dāng)用戶輸入一個(gè)圓的半徑后,可以顯示計(jì)算后的圓周長和面積值,運(yùn)行效果如圖。01設(shè)計(jì)器QtDesigner開發(fā)實(shí)例1.創(chuàng)建Qt項(xiàng)目2.界面設(shè)計(jì)3.認(rèn)識(shí)程序啟動(dòng)入口4.關(guān)聯(lián)信號(hào)與槽5.功能開發(fā)設(shè)計(jì)器QtDesigner開發(fā)實(shí)例【例】(簡單)(CH101)采用設(shè)計(jì)器QtDesigner實(shí)現(xiàn)計(jì)算圓面積,完成上圖所示的功能。首先創(chuàng)建Qt項(xiàng)目,接著進(jìn)行界面設(shè)計(jì),然后編寫相應(yīng)的功能代碼。1.創(chuàng)建Qt項(xiàng)目(1)運(yùn)行QtCreator,在歡迎界面左側(cè)點(diǎn)“CreateProject...”按鈕,或者選擇“文件”→“NewProject...”命令,創(chuàng)建一個(gè)新的項(xiàng)目,出現(xiàn)“NewProject”窗口,如圖。設(shè)計(jì)器QtDesigner開發(fā)實(shí)例(2)選擇一個(gè)項(xiàng)目模板。點(diǎn)左欄“Projects”列表下的“Application(Qt)”,中間欄選“QtWidgetsApplication”選項(xiàng),單擊右下角“Choose...”按鈕,進(jìn)入下一步。(3)命名自己的項(xiàng)目并選擇保存路徑。項(xiàng)目命名沒有大小寫要求,依個(gè)人習(xí)慣,這里將項(xiàng)目命名為CircleCal。注意:保存項(xiàng)目的路徑中不能有中文字符。如圖所示,單擊“下一步”按鈕進(jìn)入下一步驟。設(shè)計(jì)器QtDesigner開發(fā)實(shí)例(4)接下來的界面讓用戶選擇項(xiàng)目的構(gòu)建(編譯)工具,這里選qmake,如圖所示,單擊“下一步”按鈕。設(shè)計(jì)器QtDesigner開發(fā)實(shí)例(5)在“ClassInformation”頁根據(jù)實(shí)際需要選擇一個(gè)“基類”。這里選擇QDialog對(duì)話框類作為基類,“Classname”(類名)填寫Dialog,這時(shí)“Headerfile”(頭文件)、“Sourcefile”(源文件)及“Formfile”(界面文件)都出現(xiàn)默認(rèn)的文件名dialog,但建議讀者根據(jù)項(xiàng)目程序功能改名,這里將3個(gè)文件都重命名為circleCal。默認(rèn)選中“Generateform”(創(chuàng)建界面)復(fù)選框,表示需要采用設(shè)計(jì)器QtDesigner來可視化地設(shè)計(jì)界面,如圖所示,單擊“下一步”按鈕。設(shè)計(jì)器QtDesigner開發(fā)實(shí)例(6)再次單擊“下一步”按鈕,進(jìn)入“KitSelection”(選擇構(gòu)建套件)界面,由于之前安裝選擇組件的時(shí)候已經(jīng)指定了使用唯一的編譯器MinGW,故這里只有一個(gè)選項(xiàng)“DesktopQt5.15.2MinGW64-bit”,如圖,直接單擊“下一步”按鈕進(jìn)入下一步驟即可。設(shè)計(jì)器QtDesigner開發(fā)實(shí)例(7)此時(shí),相應(yīng)的文件已經(jīng)自動(dòng)加載到項(xiàng)目文件列表中,如圖。設(shè)計(jì)器QtDesigner開發(fā)實(shí)例QtCreator界面左上方出現(xiàn)項(xiàng)目結(jié)構(gòu)的樹形視圖,項(xiàng)目的所有文件自動(dòng)在視圖中分類顯示,如圖1.20(a)所示,各文件包含在相應(yīng)的節(jié)點(diǎn)中,單擊節(jié)點(diǎn)前的“”圖標(biāo)可以顯示該節(jié)點(diǎn)下的文件;而單擊節(jié)點(diǎn)前的“”圖標(biāo)則可隱藏該節(jié)點(diǎn)下的文件。單擊上部灰色工具欄中的過濾符號(hào)后,彈出一個(gè)下拉列表,勾選“簡化樹形視圖”則切換到簡單的文件列表樣式,如圖1.20(b)所示。
設(shè)計(jì)器QtDesigner開發(fā)實(shí)例2.界面設(shè)計(jì)拖曳左側(cè)組件箱的滑動(dòng)條,在最后的DisplayWidgets容器欄(如圖1)中找到Label標(biāo)簽控件,拖曳三個(gè)此控件到中央設(shè)計(jì)區(qū)的窗體上;同樣,在InputWidgets容器欄(如圖2)中找到LineEdit單行文本框控件,也拖曳三個(gè)到窗體上,用于輸入半徑值及顯示計(jì)算結(jié)果;在Buttons容器欄(如圖3)中找到PushButton按鈕控件,拖曳一個(gè)到窗體上。
設(shè)計(jì)器QtDesigner開發(fā)實(shí)例設(shè)置窗體上各控件的屬性。分別選中要設(shè)置屬性的控件,根據(jù)表1.1在設(shè)計(jì)環(huán)境右下方的屬性編輯器中進(jìn)行設(shè)置。編號(hào)控件類別對(duì)象名稱屬性說明
DialogDialoggeometry:[(0,0),350x200]windowTitle:計(jì)算圓面積①Labellabelgeometry:[(80,40),71x21]text:半徑=②Labellabel_2geometry:[(80,80),71x21]text:周長=③Labellabel_3geometry:[(80,120),71x21]text:面積=④LineEditleRadiusgeometry:[(140,40),113x21]⑤LineEditleLengthenabled:取消勾選,表示本文本框不可輸入geometry:[(140,80),113x21]⑥LineEditleAreaenabled:取消勾選,表示本文本框不可輸入geometry:[(140,120),113x21]⑦PushButtonpbCalgeometry:[(140,160),93x28]text:計(jì)算設(shè)計(jì)器QtDesigner開發(fā)實(shí)例設(shè)計(jì)區(qū)窗體呈現(xiàn)的效果如圖。此時(shí)從對(duì)象檢查器可看到窗體中各控件對(duì)象的名稱及所屬的類,如圖。設(shè)計(jì)器QtDesigner開發(fā)實(shí)例3.認(rèn)識(shí)程序啟動(dòng)入口在開發(fā)功能之前,先來簡單認(rèn)識(shí)一下Qt程序的啟動(dòng)入口。每個(gè)Qt項(xiàng)目都有一個(gè)最初執(zhí)行的入口函數(shù),在項(xiàng)目樹形視圖的“Sources”節(jié)點(diǎn)下找到main.cpp文件,其中的main()函數(shù)就是整個(gè)項(xiàng)目程序的啟動(dòng)入口,如下:#include"circleCal.h" //(a)
#include<QApplication> //(b)
intmain(intargc,char*argv[]) //(c){QApplicationa(argc,argv); //(d)Dialogw; //創(chuàng)建一個(gè)對(duì)話框?qū)ο體.show(); //(e)returna.exec(); //(f)}設(shè)計(jì)器QtDesigner開發(fā)實(shí)例4.關(guān)聯(lián)信號(hào)與槽(1)添加槽右擊對(duì)象檢查器中的“Dialog”對(duì)象,彈出快捷菜單選擇“改變信號(hào)/槽...”,彈出“Dialog的信號(hào)/槽”對(duì)話框,點(diǎn)上部“槽”列表左下角的按鈕,列表中出現(xiàn)一可編輯條目,輸入槽calCircle(),點(diǎn)“確定”按鈕,如圖。設(shè)計(jì)器QtDesigner開發(fā)實(shí)例(2)進(jìn)入“信號(hào)/槽”編輯模式點(diǎn)設(shè)計(jì)區(qū)窗體頂部的(編輯信號(hào)/槽)按鈕或選擇主菜單“編輯”→“EditSignals/Slots”。(3)按鈕clicked信號(hào)連接槽移動(dòng)鼠標(biāo)指針到“計(jì)算”(pbCal)按鈕上,按鈕周邊出現(xiàn)紅色邊框,按下左鍵拖曳,從按鈕上拉出一條接地線,如圖。設(shè)計(jì)器QtDesigner開發(fā)實(shí)例(4)文本框returnPressed信號(hào)連接槽操作類同第(3)步,拖曳半徑文本框(leRadius)接地,在彈出“配置連接”對(duì)話框中分別選中文本框的returnPressed信號(hào)與窗體的calCircle()槽,點(diǎn)“確定”按鈕。以上兩個(gè)信號(hào)與槽關(guān)聯(lián)好的界面如圖。設(shè)計(jì)器QtDesigner開發(fā)實(shí)例5.功能開發(fā)首先,在circleCal.h中聲明槽函數(shù)calCircle()(加黑處),如下:#ifndefDIALOG_H#defineDIALOG_H
#include<QDialog>
QT_BEGIN_NAMESPACEnamespaceUi{classDialog;}QT_END_NAMESPACE
classDialog:publicQDialog{Q_OBJECT //(a)
public:Dialog(QWidget*parent=nullptr);~Dialog();
privateslots:
voidcalCircle(); //(b)
private:Ui::Dialog*ui; //(c)};#endif//DIALOG_H在circleCal.cpp中編寫槽函數(shù)calCircle()的實(shí)現(xiàn)代碼(加黑段),如下。02直接代碼開發(fā)實(shí)例1.創(chuàng)建Qt項(xiàng)目2.代碼定義界面3.關(guān)聯(lián)信號(hào)與槽4.功能開發(fā)直接代碼開發(fā)實(shí)例【例】(簡單)
(CH102)采用編寫代碼的方式來實(shí)現(xiàn)計(jì)算圓面積的功能。實(shí)現(xiàn)步驟如下。1.創(chuàng)建Qt項(xiàng)目創(chuàng)建過程同上節(jié)設(shè)計(jì)器QtDesigner開發(fā)實(shí)例,只是第(5)步在“ClassInformation”頁取消“Generateform”(創(chuàng)建界面)復(fù)選框的選中狀態(tài),這樣創(chuàng)建的Qt項(xiàng)目樹形視圖中將不包含“Forms”節(jié)點(diǎn)及其下的circleCal.ui文件,故無法進(jìn)入QtDesigner設(shè)計(jì)環(huán)境,只能用代碼來定義界面。2.代碼定義界面首先,在項(xiàng)目circleCal.h中添加如下加黑代碼。然后,在circleCal.cpp中編寫initUi()函數(shù),以代碼構(gòu)建程序界面。直接代碼開發(fā)實(shí)例3.關(guān)聯(lián)信號(hào)與槽本例在創(chuàng)建半徑輸入文本框和“計(jì)算”命令按鈕的代碼后面,都用語句設(shè)置了信號(hào)與槽的關(guān)聯(lián),如下:leRadius=newQLineEdit(this); //創(chuàng)建半徑輸入文本框leRadius->setGeometry(140,40,113,21);connect(leRadius,SIGNAL(returnPressed()),this,SLOT(calCircle()));......pbCal=newQPushButton("計(jì)算",this); //創(chuàng)建“計(jì)算”命令按鈕pbCal->setGeometry(140,160,93,28);connect(pbCal,SIGNAL(clicked()),this,SLOT(calCircle()));在用代碼構(gòu)建界面時(shí),為使控件能響應(yīng)用戶操作,必須用程序語句設(shè)置信號(hào)(控件接受的事件)與槽(功能函數(shù))之間的關(guān)聯(lián)。信號(hào)與槽是Qt的核心機(jī)制,當(dāng)信號(hào)發(fā)出時(shí),與之連接的槽就會(huì)自動(dòng)執(zhí)行,設(shè)置信號(hào)槽關(guān)聯(lián)的語句一般形式為:connect(控件1,SIGNAL(信號(hào)1),控件2,SLOT(槽2/信號(hào)2));直接代碼開發(fā)實(shí)例4.功能開發(fā)最后,在circleCal.cpp中編寫實(shí)現(xiàn)圓面積計(jì)算的槽函數(shù)calCircle,代碼如下:voidDialog::calCircle(){boolok;QStringvalue=leRadius->text();intr=value.toInt(&ok);if(r>=0){floatlength=2*3.14159*r;doublearea=3.14159*r*r;leLength->setText(QString::number(length));leArea->setText(QString::number(area));}}QT5開發(fā)及實(shí)例(第5版)第2章Qt5模板庫、工具類及控件——字符串類01操作字符串操作字符串(1)QString提供了一個(gè)二元的“+”操作符用于組合兩個(gè)字符串,并提供了一個(gè)“+=”操作符用于將一個(gè)字符串追加到另一個(gè)字符串的末尾,例如:QStringstr1="Welcome";str1=str1+"toyou!"; //str1="Welcometoyou!"QStringstr2="Hello,";str2+="World!"; //str2="Hello,World!"其中,QStringstr1="Welcome"傳遞給QString一個(gè)constchar*類型的ASCII字符串“Welcome”,它被解釋為一個(gè)典型的以“\0”結(jié)尾的C類型字符串。這將會(huì)導(dǎo)致調(diào)用QString構(gòu)造函數(shù),來初始化一個(gè)QString字符串。其構(gòu)造函數(shù)原型為:QT_ASCII_CAST_WARN_CONSTRUCTORQString::QString(constchar*str)被傳遞的constchar*類型的指針又將被QString::fromAscii()函數(shù)轉(zhuǎn)換為Unicode編碼。操作字符串(2)QString::append()函數(shù)具有與“+=”操作符同樣的功能,實(shí)現(xiàn)在一個(gè)字符串的末尾追加另一個(gè)字符串,例如:QStringstr1="Welcome";QStringstr2="to";str1.append(str2); //str1="Welcometo"str1.append("you!"); //str1="Welcometoyou!"(3)組合字符串的另一個(gè)函數(shù)是QString::sprintf(),此函數(shù)支持的格式定義符和C++庫中的函數(shù)sprintf()定義的一樣。例如:QStringstr;str.sprintf("%s","Welcome"); //str="Welcome"str.sprintf("%s","toyou!"); //str="toyou!"str.sprintf("%s%s","Welcome","toyou!"); //str="Welcometoyou!"操作字符串(4)Qt還提供了另一種方便的字符串組合方式,使用QString::arg()函數(shù),此函數(shù)的重載可以處理很多的數(shù)據(jù)類型。此外,一些重載具有額外的參數(shù)對(duì)字段的寬度、數(shù)字基數(shù)或者浮點(diǎn)數(shù)精度進(jìn)行控制。通常,相對(duì)于QString::sprintf()函數(shù),QString::arg()函數(shù)是一個(gè)比較好的解決方案,因?yàn)槠漕愋桶踩?,完全支持Unicode,并且允許改變"%n"參數(shù)的順序。例如:QStringstr;str=QString("%1wasbornin%2.").arg("John").arg(1998);//str="Johnwasbornin1998."(5)QString也提供了一些其他組合字符串的方法,包括如下幾種。①insert()函數(shù):在原字符串特定的位置插入另一個(gè)字符串。②prepend()函數(shù):在原字符串的開頭插入另一個(gè)字符串。③replace()函數(shù):用指定的字符串代替原字符串中的某些字符。(6)很多時(shí)候,去掉一個(gè)字符串兩端的空白(空白字符包括回車字符“\n”、換行字符“\r”、制表符“\t”和空格字符“”等)非常有用,如獲取用戶輸入的賬號(hào)時(shí)。①Q(mào)String::trimmed()函數(shù):移除字符串兩端的空白字符。②QString::simplified()函數(shù):移除字符串兩端的空白字符,使用單個(gè)空格字符“”代替字符串中出現(xiàn)的空白字符。例如:QStringstr="Welcome\tto\nyou!";str=str.trimmed(); //str="Welcome\tto\nyou!"02查詢字符串?dāng)?shù)據(jù)查詢字符串?dāng)?shù)據(jù)(1)QString::startsWith()函數(shù)判斷一個(gè)字符串是否以某個(gè)字符串開頭。此函數(shù)具有兩個(gè)參數(shù)。第一個(gè)參數(shù)指定了一個(gè)字符串,第二個(gè)參數(shù)指定是否大小寫敏感(默認(rèn)情況下,是大小寫敏感的),例如:QStringstr="Welcometoyou!";str.startsWith("Welcome",Qt::CaseSensitive); //返回truestr.startsWith("you",Qt::CaseSensitive); //返回false(2)QString::endsWith()函數(shù)類似于QString::startsWith()函數(shù),此函數(shù)判斷一個(gè)字符串是否以某個(gè)字符串結(jié)尾。(3)QString::contains()函數(shù)判斷一個(gè)指定的字符串是否出現(xiàn)過,例如:QStringstr="Welcometoyou!";str.contains("Welcome",Qt::CaseSensitive); //返回true查詢字符串?dāng)?shù)據(jù)(4)比較兩個(gè)字符串也是經(jīng)常使用的功能,QString提供了多種比較手段。①operator<(constQString&):比較一個(gè)字符串是否小于另一個(gè)字符串。如果是,則返回true。②operator<=(constQString&):比較一個(gè)字符串是否小于等于另一個(gè)字符串。如果是,則返回true。③operator==(constQString&):比較兩個(gè)字符串是否相等。如果相等,則返回true。④operator>=(constQString&):比較一個(gè)字符串是否大于等于另一個(gè)字符串。如果是,則返回true。⑤localeAwareCompare(constQString&,constQString&):靜態(tài)函數(shù),比較前后兩個(gè)字符串。⑥compare(constQString&,constQString&,Qt::CaseSensitivity):該函數(shù)可以指定是否進(jìn)行大小寫的比較,而大小寫的比較是完全基于字符的Unicode編碼值的,而且是非??斓?,返回值類似于localeAwareCompare()函數(shù)。03字符串的轉(zhuǎn)換字符串的轉(zhuǎn)換QString類提供了豐富的轉(zhuǎn)換函數(shù),可以將一個(gè)字符串轉(zhuǎn)換為數(shù)值類型或者其他的字符編碼集。(1)QString::toInt()函數(shù)將字符串轉(zhuǎn)換為整型數(shù)值,類似的函數(shù)還有toDouble()、toFloat()、toLong()、toLongLong()等。下面舉個(gè)例子說明其用法:QStringstr="125"; //初始化一個(gè)"125"的字符串boolok;inthex=str.toInt(&ok,16); //ok=true,hex=293intdec=str.toInt(&ok,10); //ok=true,dec=125(2)QString提供的字符編碼集的轉(zhuǎn)換函數(shù)將會(huì)返回一個(gè)constchar*類型版本的QByteArray,即構(gòu)造函數(shù)QByteArray(constchar*)構(gòu)造的QByteArray對(duì)象。QByteArray類具有一個(gè)字節(jié)數(shù)組,它既可以存儲(chǔ)原始字節(jié)(rawbytes),也可以存儲(chǔ)傳統(tǒng)的以“\0”結(jié)尾的8位的字符串。在Qt中,使用QByteArray比使用constchar*更方便,且QByteArray也支持隱式共享。轉(zhuǎn)換函數(shù)有以下幾種。①toAscii():返回一個(gè)ASCII編碼的8位字符串。②toLatin1():返回一個(gè)Latin-1(ISO8859-1)編碼的8位字符串。③toUtf8():返回一個(gè)UTF-8編碼的8位字符串(UTF-8是ASCII碼的超集,它支持整個(gè)Unicode字符集)。④toLocal8Bit():返回一個(gè)系統(tǒng)本地(locale)編碼的8位字符串。字符串的轉(zhuǎn)換下面舉例說明其用法:QStringstr="Welcometoyou!"; //初始化一個(gè)字符串對(duì)象QByteArrayba=str.toAscii(); //(a)qDebug()<<ba; //(b)ba.append("Hello,World!"); //(c)qDebug()<<ba.data(); //輸出最后結(jié)果一個(gè)NULL字符串就是使用QString的默認(rèn)構(gòu)造函數(shù)或者使用“(constchar*)0”作為參數(shù)的構(gòu)造函數(shù)創(chuàng)建的QString字符串對(duì)象;而一個(gè)空字符串是一個(gè)大小為0的字符串。一個(gè)NULL字符串一定是一個(gè)空字符串,而一個(gè)空字符串未必是一個(gè)NULL字符串。例如:QString().isNull(); //結(jié)果為trueQString().isEmpty(); //結(jié)果為trueQString("").isNull(); //結(jié)果為falseQString("").isEmpty(); //結(jié)果為trueQT5開發(fā)及實(shí)例(第5版)第2章Qt5模板庫、工具類及控件——容器類容器類這樣的數(shù)據(jù)類型包含了通常使用的大多數(shù)數(shù)據(jù)類型,包括基本數(shù)據(jù)類型(如int和double等)和Qt的一些數(shù)據(jù)類型(如QString、QDate和QTime等)。不過,Qt的QObject及其他的子類(如QWidget和Qdialog等)是不能夠存儲(chǔ)在容器中的,例如:QList<QToolBar>list;一個(gè)可代替的方案是存儲(chǔ)QObject及其子類的指針,例如:QList<QToolBar*>list;Qt的容器類是可以嵌套的,例如:QHash<QString,QList<double>>Qt的容器類為遍歷其中的內(nèi)容提供了以下兩種方法。(1)Java風(fēng)格的迭代器(Java-styleiterators)。(2)STL風(fēng)格的迭代器(STL-styleiterators),能夠同Qt和STL的通用算法一起使用,并且在效率上也略勝一籌。01QList類、QLinkedList類和QVector類1.QList類2.QLinkedList類3.QVector類4.Java風(fēng)格迭代器遍歷容器5.STL風(fēng)格迭代器遍歷容器QList類、QLinkedList類和QVector類經(jīng)常使用的Qt容器類有QList、QLinkedList和QVector等。在開發(fā)一個(gè)較高性能需求的應(yīng)用程序時(shí),程序員會(huì)比較關(guān)注這些容器類的運(yùn)行效率。表列出了QList、QLinkedList和QVector容器的時(shí)間復(fù)雜度比較。容
器
類查
找插
入頭
部
添
加尾
部
添
加QListO(1)O(n)Amort.O(1)Amort.O(1)QLinkedListO(n)O(1)O(1)O(1)QVectorO(1)O(n)O(n)Amort.O(1)1.QList類QList<T>是迄今為止最常用的容器類,它存儲(chǔ)給定數(shù)據(jù)類型T的一列數(shù)值。繼承自QList類的子類有QItemSelection、QQueue、QSignalSpy、QStringList和QTestEventList。QList不僅提供了可以在列表中進(jìn)行追加的QList::append()和Qlist::prepend()函數(shù),還提供了在列表中間完成插入操作的QList::insert()函數(shù)。相對(duì)于任何其他的Qt容器類,為了使可執(zhí)行代碼盡可能少,QList被高度優(yōu)化。QList<T>維護(hù)了一個(gè)指針數(shù)組,該數(shù)組存儲(chǔ)的指針指向QList<T>存儲(chǔ)的列表項(xiàng)的內(nèi)容。因此,QList<T>提供了基于下標(biāo)的快速訪問。QList類、QLinkedList類和QVector類對(duì)于不同的數(shù)據(jù)類型,QList<T>采取不同的存儲(chǔ)策略,存儲(chǔ)策略有以下幾種。(1)如果T是一個(gè)指針類型或指針大小的基本類型(即該基本類型占有的字節(jié)數(shù)和指針類型占有的字節(jié)數(shù)相同),QList<T>會(huì)將數(shù)值直接存儲(chǔ)在它的數(shù)組中。(2)如果QList<T>存儲(chǔ)對(duì)象的指針,則該指針指向?qū)嶋H存儲(chǔ)的對(duì)象。下面舉一個(gè)例子:#include<QDebug>intmain(intargc,char*argv[]){ QList<QString>list; //(a) { QStringstr("Thisisateststring"); list<<str; //(b) } //(c) qDebug()<<list[0]<<"Howareyou!"; return0;}QList類、QLinkedList類和QVector類2.QLinkedList類QLinkedList<T>是一個(gè)鏈?zhǔn)搅斜?,它以非連續(xù)的內(nèi)存塊保存數(shù)據(jù)。QLinkedList<T>不能使用下標(biāo),只能使用迭代器訪問它的數(shù)據(jù)項(xiàng)。與QList相比,當(dāng)對(duì)一個(gè)很大的列表進(jìn)行插入操作時(shí),QLinkedList具有更高的效率。3.QVector類QVector<T>在相鄰的內(nèi)存中存儲(chǔ)給定數(shù)據(jù)類型T的一組數(shù)值。在一個(gè)QVector的前部或者中間位置進(jìn)行插入操作的速度是很慢的,這是因?yàn)檫@樣的操作將導(dǎo)致內(nèi)存中的大量數(shù)據(jù)被移動(dòng),這是由QVector存儲(chǔ)數(shù)據(jù)的方式?jīng)Q定的。QVector<T>既可以使用下標(biāo)訪問數(shù)據(jù)項(xiàng),也可以使用迭代器訪問數(shù)據(jù)項(xiàng)。繼承自QVector類的子類有QPolygon、QPolygonF和QStack。QList類、QLinkedList類和QVector類4.Java風(fēng)格迭代器遍歷容器Java風(fēng)格迭代器同STL風(fēng)格迭代器相比,使用起來更簡單方便,不過這也是以輕微的性能損耗為代價(jià)的。對(duì)于每一個(gè)容器類,Qt提供了兩種類型的Java風(fēng)格迭代器數(shù)據(jù)類型,即只讀迭代器類和讀寫迭代器類,見表。容
器
類只讀迭代器類讀寫迭代器類QList<T>,QQueue<T>QListIterator<T>QMutableListIterator<T>QLinkedList<T>QLinkedListIterator<T>QMutableLinkedListIterator<T>QVector<T>,QStack<T>QVectorIterator<T>QMutableVectorIterator<T>QList類、QLinkedList類和QVector類(1)QList只讀遍歷方法?!纠浚ê唵危–H201)通過控制臺(tái)程序?qū)崿F(xiàn)QList只讀遍歷方法。其具體代碼如下:#include<QCoreApplication> #include<QDebug> //(a)intmain(intargc,char*argv[]){QCoreApplicationa(argc,argv); //(b)QList<int>list; //創(chuàng)建一個(gè)QList<int>棧對(duì)象listlist<<1<<2<<3<<4<<5; //用操作運(yùn)算符“<<”輸入五個(gè)整數(shù)QListIterator<int>i(list); //(c)for(;i.hasNext();) //(d)qDebug()<<i.next();returna.exec();}QList類、QLinkedList類和QVector類(2)QListIterator<T>是只讀迭代器,它不能完成列表項(xiàng)的插入和刪除操作。讀寫迭代器QMutableListIterator<T>除提供基本的遍歷操作(與QListIterator的操作相同)外,還提供了insert()插入操作函數(shù)、remove()刪除操作函數(shù)和修改數(shù)據(jù)函數(shù)等?!纠浚ê唵危–H202)通過控制臺(tái)程序?qū)崿F(xiàn)QList讀寫遍歷方法。具體代碼如下:#include<QCoreApplication>#include<QDebug>intmain(intargc,char*argv[]){ QCoreApplicationa(argc,argv); QList<int>list; //創(chuàng)建一個(gè)空的列表list QMutableListIterator<int>i(list); //創(chuàng)建上述列表的讀寫迭代器 for(intj=0;j<10;++j) i.insert(j); //(a) for(i.toFront();i.hasNext();) //(b) qDebug()<<i.next(); for(i.toBack();i.hasPrevious();) //(c) { if(i.previous()%2==0)
i.remove(); else i.setValue(i.peekNext()*10); //(d) } for(i.toFront();i.hasNext();) //重新遍歷并輸出列表 qDebug()<<i.next(); returna.exec();}QList類、QLinkedList類和QVector類5.STL風(fēng)格迭代器遍歷容器對(duì)于每個(gè)容器類,Qt都提供了兩種類型的STL風(fēng)格迭代器數(shù)據(jù)類型:一種提供只讀訪問;另一種提供讀寫訪問。由于只讀類型的迭代器的運(yùn)行速度要比讀寫迭代器的運(yùn)行速度快,所以應(yīng)盡可能地使用只讀類型的迭代器。STL風(fēng)格迭代器的兩種分類見表。容
器
類只讀迭代器類讀寫迭代器類QList<T>,QQueue<T>QList<T>::const_iteratorQList<T>::iteratorQLinkedList<T>QLinkedList<T>::const_iteratorQLinkedList<T>::iteratorQVector<T>,QStack<T>QVector<T>::const_iteratorQVector<T>::iteratorQList類、QLinkedList類和QVector類【例】(簡單)(CH203)使用STL風(fēng)格迭代器。具體代碼如下:#include<QCoreApplication>#include<QDebug>intmain(intargc,char*argv[]){ QCoreApplicationa(argc,argv); QList<int>list; //初始化一個(gè)空的QList<int>列表 for(intj=0;j<10;j++) list.insert(list.end(),j); //(a) QList<int>::iteratori; //初始化一個(gè)QList<int>::iterator讀寫迭代器 for(i=list.begin();i!=list.end();++i) //(b) { qDebug()<<(*i); *i=(*i)*10; } //初始化一個(gè)QList<int>::const_iterator讀寫迭代器 QList<int>::const_iteratorci; //在控制臺(tái)輸出列表的所有值 for(ci=list.constBegin();ci!=list.constEnd();++ci) qDebug()<<*ci; returna.exec();}02QMap類和QHash類1.QMap類2.QHash類3.Java風(fēng)格迭代器遍歷容器4.STL風(fēng)格迭代器遍歷容器QMap類和QHash類1.QMap類QMap<Key,T>提供了一個(gè)從類型為Key的鍵到類型為T的值的映射。通常,QMap存儲(chǔ)的數(shù)據(jù)形式是一個(gè)鍵對(duì)應(yīng)一個(gè)值,并且按照鍵Key的順序存儲(chǔ)數(shù)據(jù)。為了能夠支持一鍵多值的情況,QMap提供了QMap<Key,T>::insertMulti()和QMap<Key,T>::values()函數(shù)。存儲(chǔ)一鍵多值的數(shù)據(jù)時(shí),也可以使用QMultiMap<Key,T>容器,它繼承自QMap。2.QHash類QHash<Key,T>具有與QMap幾乎完全相同的API。QHash維護(hù)著一張哈希表(HashTable),哈希表的大小與QHash的數(shù)據(jù)項(xiàng)的數(shù)目相適應(yīng)。QHash以任意的順序組織它的數(shù)據(jù)。當(dāng)存儲(chǔ)數(shù)據(jù)的順序無關(guān)緊要時(shí),建議使用QHash作為存放數(shù)據(jù)的容器。QHash也可以存儲(chǔ)一鍵多值形式的數(shù)據(jù),它的子類QMultiHash<Key,T>實(shí)現(xiàn)了一鍵多值的語義。QMap類和QHash類3.Java風(fēng)格迭代器遍歷容器對(duì)于每一個(gè)容器類,Qt都提供了兩種類型的Java風(fēng)格迭代器數(shù)據(jù)類型:一種提供只讀訪問;另一種提供讀寫訪問。Java風(fēng)格迭代器的兩種分類見表。容
器
類只讀迭代器類讀寫迭代器類QMap<Key,T>,QMultiMap<Key,T>QMapIterator<Key,T>QMutableMapIterator<Key,T>QHash<Key,T>,QMultiHash<Key,T>QHashIterator<Key,T>QMutableHashIterator<Key,T>QMap類和QHash類【例】(簡單)(CH204)在QMap中的插入、遍歷和修改。具體代碼如下:#include<QCoreApplication>#include<QDebug>intmain(intargc,char*argv[]){ QCoreApplicationa(argc,argv); QMap<QString,QString>map; //創(chuàng)建一個(gè)QMap棧對(duì)象 //向棧對(duì)象插入<城市,區(qū)號(hào)>對(duì) map.insert("beijing","111"); map.insert("shanghai","021"); map.insert("nanjing","025"); QMapIterator<QString,QString>i(map); //創(chuàng)建一個(gè)只讀迭代器 for(;i.hasNext();) //(a) { i.next(); qDebug()<<""<<i.key()<<""<<i.value(); } QMutableMapIterator<QString,QString>mi(map); if(mi.findNext("111")) //(b) mi.setValue("010"); QMapIterator<QString,QString>modi(map); qDebug()<<""; for(;modi.hasNext();) //再次遍歷并輸出修改后的結(jié)果 { modi.next(); qDebug()<<""<<modi.key()<<""<<modi.value(); } returna.exec();}QMap類和QHash類4.STL風(fēng)格迭代器遍歷容器對(duì)于每一個(gè)容器類,Qt都提供了兩種類型的STL風(fēng)格迭代器數(shù)據(jù)類型:一種提供只讀訪問;另一種提供讀寫訪問。STL風(fēng)格迭代器的兩種分類見表。容
器
類只讀迭代器類讀寫迭代器類QMap<Key,T>,QMultiMap<Key,T>QMap<Key,T>::const_iteratorQMap<Key,T>::iteratorQHash<Key,T>,QMultiHash<Key,T>QHash<Key,T>::const_iteratorQHash<Key,T>::iteratorQMap類和QHash類【例】(簡單)(CH205)功能與使用Java風(fēng)格迭代器的例子基本相同。不同的是,這里通過查找鍵來實(shí)現(xiàn)值的修改。具體代碼如下:#include<QCoreApplication>#include<QDebug>intmain(intargc,char*argv[]){ QCoreApplicationa(argc,argv); QMap<QString,QString>map; map.insert("beijing","111"); map.insert("shanghai","021"); map.insert("nanjing","025"); QMap<QString,QString>::const_iteratori; for(i=map.constBegin();i!=map.constEnd();++i) qDebug()<<""<<i.key()<<""<<i.value(); QMap<QString,QString>::iteratormi; mi=map.find("beijing"); if(mi!=map.end()) mi.value()="010"; //(a) QMap<QString,QString>::const_iteratormodi; qDebug()<<""; for(modi=map.constBegin();modi!=map.constEnd();++modi) qDebug()<<""<<modi.key()<<""<<modi.value(); returna.exec();}QT5開發(fā)及實(shí)例(第5版)第2章Qt5模板庫、工具類及控件——QVariant類QVariant類【例】(簡單)(CH206)QVariant類的用法。以“直接編寫代碼”(即取消勾選“Generateform”復(fù)選框)方式創(chuàng)建Qt項(xiàng)目,項(xiàng)目名myVariant,“ClassInformation”頁基類選“QWidget”。建好項(xiàng)目后,在widget.cpp文件中編寫代碼,具體內(nèi)容。QT5開發(fā)及實(shí)例(第5版)第2章Qt5模板庫、工具類及控件——算法及正則表達(dá)式01Qt5常用算法Qt5常用算法【例】(簡單)(CH207)幾個(gè)常用算法。#include<QCoreApplication>#include<QDebug>intmain(intargc,char*argv[]){ QCoreApplicationa0(argc,argv); doublea=-19.3,b=9.7; doublec=qAbs(a); //(a) doublemax=qMax(b,c); //(b) intbn=qRound(b); //(c) intcn=qRound(c); qDebug()<<"a="<<a; qDebug()<<"b="<<b; qDebug()<<"c=qAbs(a)="<<c; qDebug()<<"qMax(b,c)="<<max; qDebug()<<"bn=qRound(b)="<<bn; qDebug()<<"cn=qRound(c)="<<cn; qSwap(bn,cn); //(d) //調(diào)用qDebug()函數(shù)輸出所有的計(jì)算結(jié)果 qDebug()<<"qSwap(bn,cn):"<<"bn="<<bn<<"cn="<<cn; returna0.exec();}02基本的正則表達(dá)式基本的正則表達(dá)式正則表達(dá)式由表達(dá)式(expressions)、量詞(quantifiers)和斷言(assertions)組成。(1)最簡單的表達(dá)式是一個(gè)字符。字符集可以使用表達(dá)式如“[AEIOU]”,表示匹配所有的大寫元音字母;使用“[^AEIOU]”,表示匹配所有非元音字母,即輔音字母;連續(xù)的字符集可以使用表達(dá)式如“[a-z]”,表示匹配所有的小寫英文字母。(2)量詞說明表達(dá)式出現(xiàn)的次數(shù),如“x[1,2]”表示“x”可以至少有一個(gè),至多有兩個(gè)。在計(jì)算機(jī)語言中,標(biāo)識(shí)符通常要求以字母或下畫線(也稱下畫線)開頭,后面可以是字母、數(shù)字和下畫線。滿足條件的標(biāo)識(shí)符表示為:"[A-Za-z_]+[A-Za-z_0-9]*"正則表達(dá)式的量詞見表。量
詞含
義量
詞含
義E?匹配0次或1次E[n,]至少匹配n次E+匹配1次或多次E[,m]最多匹配m次E*匹配0次或多次E[n,m]至少匹配n次,最多匹配m次E[n]匹配n次
基本的正則表達(dá)式(3)“^”“$”“\b”都是正則表達(dá)式的斷言,正則表達(dá)式的斷言見表。符
號(hào)含
義符
號(hào)含
義^表示在字符串開頭進(jìn)行匹配\B非單詞邊界$表示在字符串結(jié)尾進(jìn)行匹配(?=E)表示表達(dá)式后緊隨E才匹配\b單詞邊界(?!E)表示表達(dá)式后不跟隨E才匹配例如,若要只有在using后面是namespace時(shí)才匹配using,則可以使用“using(?=E\s+namespace)”(此處“?=E”后的“\s”表示匹配一個(gè)空白字符,下同)。QT5開發(fā)及實(shí)例(第5版)第2章Qt5模板庫、工具類及控件——控
件01按鈕組(Buttons)按鈕組(Buttons)按鈕組(Buttons)如圖。按鈕組(Buttons)中各個(gè)按鈕的名稱依次解釋如下。
PushButton:按鈕。
ToolButton:工具按鈕。
RadioButton:單選按鈕。
CheckBox:復(fù)選框。
CommandLinkButton:命令鏈接按鈕。
DialogButtonBox:對(duì)話框按鈕盒。按鈕組(Buttons)【例】(簡單)(CH208)以QPushButton為例介紹按鈕的用法。(1)以“直接編寫代碼”(即取消勾選“Generateform”復(fù)選框)方式創(chuàng)建Qt項(xiàng)目,項(xiàng)目名PushButtonTest,“ClassInformation”頁基類選“QWidget”,類名命名為“MyWidget”。(2)在頭文件mywidget.h中的具體代碼如下:#ifndefMYWIDGET_H#defineMYWIDGET_H#include<QWidget>classMyWidget:publicQWidget{Q_OBJECTpublic:MyWidget(QWidget*parent=0);~MyWidget();};#endif//MYWIDGET_H按鈕組(Buttons)(3)在源文件mywidget.cpp中的具體代碼如下:#include"mywidget.h"#include<qapplication.h>#include<qpushbutton.h>#include<qfont.h>MyWidget::MyWidget(QWidget*parent):QWidget(parent){setMinimumSize(200,120);setMaximumSize(200,120);QPushButton*quit=newQPushButton("Quit",this);quit->setGeometry(62,40,75,30);quit->setFont(QFont("Times",18,QFont::Bold));connect(quit,SIGNAL(clicked()),qApp,SLOT(quit()));}MyWidget::~MyWidget(){}按鈕組(Buttons)(4)在源文件main.cpp中的具體代碼如下:#include"mywidget.h"#include<QApplication>intmain(intargc,char*argv[]){ QApplicationa(argc,argv); MyWidgetw; w.setGeometry(100,100,200,120); w.show(); returna.exec();}(5)QPushButton實(shí)例的運(yùn)行結(jié)果如圖。02輸入部件組(InputWidgets)1.QDateTime類2.QTimer類輸入部件組(InputWidgets)輸入部件組(InputWidgets)如圖,組中各個(gè)部件的名稱依次解釋如下。
ComboBox:組合框。
FontComboBox:字體組合框。
LineEdit:行編輯框。
TextEdit:文本編輯框。
PlainTextEdit:純文本編輯框。
SpinBox:數(shù)字顯示框(自旋盒)。
DoubleSpinBox:雙自旋盒。
TimeEdit:時(shí)間編輯。
DateEdit:日期編輯。
Date/TimeEdit:日期/時(shí)間編輯。
Dial:撥號(hào)。
HorizontalScrollBar:橫向滾動(dòng)條。
VerticalScrollBar:垂直滾動(dòng)條。
HorizontalSlider:橫向滑塊。
VerticalSlider:垂直滑塊。
KeySequenceEdit:按鍵序列編輯框。輸入部件組(InputWidgets)1.QDateTime類Date/TimeEdit對(duì)應(yīng)于QDateTime類,在Qt5中可以使用它來獲得系統(tǒng)時(shí)間。通過QDateTime::currentDateTime()來獲取本地系統(tǒng)的時(shí)間和日期信息??梢酝ㄟ^date()和time()來返回datetime中的日期和時(shí)間部分,典型代碼如下:QLabel*datalabel=newQLabel();QDateTime*datatime=newQDateTime(QDateTime::currentDateTime());datalabel->setText(datatime->date().toString());datalabel->show();輸入部件組(InputWidgets)2.QTimer類定時(shí)器(QTimer)的使用非常簡單,只需要以下幾個(gè)步驟就可以完成定時(shí)器的應(yīng)用。(1)新建一個(gè)定時(shí)器。QTimer*time_clock=newQTimer(parent);(2)連接這個(gè)定時(shí)器的信號(hào)和槽,利用定時(shí)器的timeout()。connect(time_clock,SIGNAL(timeout()),this,SLOT(slottimedone()));即定時(shí)時(shí)間一到就會(huì)發(fā)送timeout()信號(hào),從而觸發(fā)slottimedone()槽去完成某件事情。(3)開啟定時(shí)器,并設(shè)定定時(shí)周期。定時(shí)器定時(shí)有兩種方式:start(inttime)和setSingleShot(true)。其中,start(inttime)表示每隔“time”秒就會(huì)重啟定時(shí)器,可以重復(fù)觸發(fā)定時(shí),利用stop()將定時(shí)器關(guān)掉;而setSingleShot(true)則是僅啟動(dòng)定時(shí)器一次。工程中常用的是前者,例如:time_clock->start(2000);03顯示控件組(DisplayWidgets)1.GraphicsView2.TextBrowser3.QQuickWidget顯示控件組(DisplayWidgets)顯示控件組(DisplayWidgets)如圖。顯示控件組(DisplayWidgets)中各個(gè)控件的名稱依次解釋如下。
Label:標(biāo)簽。
TextBrowser:文本瀏覽器。
GraphicsView:圖形視圖。
CalendarWidget:日歷。
LCDNumber:液晶數(shù)字。
ProgressBar:進(jìn)度條。
HorizontalLine:水平線。
VerticalLine:垂直線。
OpenGLWidget:開放式圖形庫工具。
QQuickWidget:嵌入QML工具。顯示控件組(DisplayWidgets)1.GraphicsViewGraphicsView對(duì)應(yīng)于QGraphicsView類,提供了Qt5的圖形視圖框架2.TextBrowserTextBrowser對(duì)應(yīng)于QTextBrowser類。QTextBrowser類繼承自QTextEdit,而且僅是只讀的,對(duì)里面的內(nèi)容不能進(jìn)行更改,但是相對(duì)于QTextEdit來講,它還具有鏈接文本的作用。QTextBrowser的屬性有以下幾點(diǎn):modified:constbool//通過布爾值來說明其內(nèi)容是否被修改openExternalLinks:boolopenLinks:boolreadOnly:constboolsearchPaths:QStringListsource:QUrlundoRedoEnabled:constbool通過以上的屬性設(shè)置,可以設(shè)定QTextBrowser是否允許外部鏈接,是否為只讀屬性,外部鏈接的路徑及鏈接的內(nèi)容,是否可以進(jìn)行撤銷等操作。QTextBrowser還提供了幾種比較有用的槽(SLOTS),即:virtualvoidbackward()virtualvoidforward()virtualvoidhome()顯示控件組(DisplayWidgets)3.QQuickWidget傳統(tǒng)QWidget程序可以用它來嵌入QML代碼,為Qt開發(fā)者將桌面應(yīng)用遷移到QtQuick提供了方便,但目前在QML中尚不能嵌入其他非QML窗口,因?yàn)镼ML的渲染機(jī)制和QWidget的是不一樣的。04空間間隔組(Spacers)空間間隔組(Spacers)空間間隔組(Spacers)如圖??臻g間隔組(Spacers)中各個(gè)控件的名稱依次解釋如下。
HorizontalSpacer:水平間隔。
VerticalSpacer:垂直間隔。05布局管理組(Layouts)布局管理組(Layouts)布局管理組(Layouts)如圖。布局管理組(Layouts)中各個(gè)控件的名稱依次解釋如下。VerticalLayout:垂直布局。HorizontalLayout:橫向(水平)布局。GridLayout:網(wǎng)格布局。FormLayout:表單布局。06容器組(Containers)1.創(chuàng)建窗口2.使用布局容器組(Containers)容器組(Containers)如圖。容器組(Containers)中各個(gè)控件的名稱依次解釋如下。
GroupBox:組框。
ScrollArea:滾動(dòng)區(qū)域。
ToolBox:工具箱。
TabWidget:標(biāo)簽小部件。
StackedWidget:堆疊部件。
Frame:幀。
Widget:小部件。
MDIArea:MDI區(qū)域。
DockWidget:??看绑w部件。
QAxWidget:封裝Flash的ActiveX控件。容器組(Containers)1.創(chuàng)建窗口如果Widget未使用父級(jí)進(jìn)行創(chuàng)建,則在顯示時(shí)視為窗口或頂層Widget。由于頂層Widget沒有父級(jí)對(duì)象類來確保在其不再被使用時(shí)就被刪除,所以需要開發(fā)人員在應(yīng)用程序中對(duì)其進(jìn)行跟蹤。例如,使用QWidget創(chuàng)建和顯示具有默認(rèn)大小的窗口:QWidget*window=newQWidget();window->resize(320,240);window->show();QPushButton*button=newQPushButton(tr("Pressme"),window);button->move(100,100);button->show();容器組(Containers)2.使用布局通常,子Widget是通過使用布局對(duì)象在窗口中進(jìn)行排列的,而不是通過指定位置和大小進(jìn)行排列的。在此,構(gòu)造一個(gè)并排排列的標(biāo)簽和行編輯框Widget:QLabel
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 廠房合同范例范例
- 公立美容服務(wù)合同范本
- 協(xié)議控股合同范例
- 行政新人試用期工作總結(jié)2025年
- 陜西省石泉縣八年級(jí)地理下冊(cè) 第六章《北方地區(qū)》備課教學(xué)實(shí)錄 (新版)新人教版
- jiam勞務(wù)合同范例
- 合作研發(fā)框架合同范例
- 農(nóng)場(chǎng)品購銷合同范本
- 人教版初中歷史與社會(huì)七年級(jí)上冊(cè) 2.3.1《人口與人種》教學(xué)設(shè)計(jì)
- 加工樁尖合同范本
- 固態(tài)電池發(fā)展趨勢(shì)研究
- 2025年哈爾濱幼兒師范高等??茖W(xué)校單招職業(yè)技能測(cè)試題庫完整
- 2025-2030年中國鐵精粉市場(chǎng)發(fā)展?fàn)顩r及營銷戰(zhàn)略研究報(bào)告
- 做最勇敢的自己
- 《生活污水》課件
- 2025年大慶職業(yè)學(xué)院單招職業(yè)技能測(cè)試題庫(名師系列)
- GB/T 23694-2024風(fēng)險(xiǎn)管理術(shù)語
- 2025年蕪湖職業(yè)技術(shù)學(xué)院高職單招職業(yè)適應(yīng)性測(cè)試近5年??及鎱⒖碱}庫含答案解析
- 創(chuàng)辦民辦學(xué)校項(xiàng)目可行性論證報(bào)告
- 律師事務(wù)所監(jiān)管資金協(xié)議書(2篇)
- 2025年江蘇南通煒賦集團(tuán)有限公司招聘筆試參考題庫含答案解析
評(píng)論
0/150
提交評(píng)論