本書著重于講解利用Qt開(kāi)發(fā)圖形界面的基礎(chǔ)知識(shí)。主要包括集成開(kāi)發(fā)環(huán)境Qt Creator的使用、基本控件、菜單和工具欄、對(duì)話框、界面布局、事件系統(tǒng)、二維繪圖、樣式表的使用等;靖采w了在Qt開(kāi)發(fā)平臺(tái)下開(kāi)發(fā)桌面窗口界面的知識(shí), 講述簡(jiǎn)單實(shí)用、步驟詳盡, 非常適合于課堂講解少而練習(xí)時(shí)間多的授課方式, 適合于在翻轉(zhuǎn)式教學(xué)模式下引導(dǎo)學(xué)生自我學(xué)習(xí)。也十分易于一般讀者自學(xué)。
Qt圖形界面編程經(jīng)典入門教材,面向基礎(chǔ),注重實(shí)踐,簡(jiǎn)單實(shí)用、步驟詳盡,適合少學(xué)時(shí)和翻轉(zhuǎn)課堂教學(xué)模式下引導(dǎo)學(xué)生自我學(xué)習(xí),被多所高校用作教材。
Qt是基于C++語(yǔ)言的著名的跨平臺(tái)開(kāi)發(fā)框架,自20世紀(jì)90年代出現(xiàn)以后,不斷發(fā)展壯大,現(xiàn)在已經(jīng)發(fā)展成為強(qiáng)大的、幾乎全功能的開(kāi)發(fā)框架。它不僅可以用于開(kāi)發(fā)用戶界面,還可以進(jìn)行數(shù)據(jù)庫(kù)、網(wǎng)絡(luò)、多媒體、嵌入式等方面的編程開(kāi)發(fā),但是Qt最側(cè)重的,歷史最悠久的仍然是GUI圖形界面開(kāi)發(fā)。Qt開(kāi)發(fā)的程序可以運(yùn)行于Windows、Linux、UNIX等主流操作系統(tǒng),只要沒(méi)有調(diào)用專屬于某個(gè)操作系統(tǒng)的功能,Qt開(kāi)發(fā)的源程序一般不用修改,只需將它的源碼在不同的操作系統(tǒng)下編譯后即可執(zhí)行,真正達(dá)到了“一次編寫,處處編譯”的境界。
全書共分10章。
第1章和第2章講述C++語(yǔ)言面向?qū)ο蟮幕A(chǔ)知識(shí)。因?yàn)楸緯俣ㄗx者了解C語(yǔ)言的編程基礎(chǔ),所以這里用兩章的篇幅介紹面向?qū)ο蟮闹R(shí),包括類和對(duì)象、類的繼承和多態(tài)等方面的知識(shí)。
第3章介紹Qt的安裝、Qt Creator的基本使用、信號(hào)與槽通信機(jī)制,以及編程中常用的幾個(gè)基本字符串類。
第4章講解基礎(chǔ)窗口類以及各種常用的界面控件,包括按鈕、標(biāo)簽、單選按鈕、檢查框、組合框、列表框、編輯框、進(jìn)度條、選項(xiàng)卡、樹(shù)狀控件、表格控件、富文本控件等。這些控件可以方便地構(gòu)造圖形界面。
第5章講解菜單、工具欄和狀態(tài)欄的基礎(chǔ)知識(shí),以及對(duì)話框的基礎(chǔ)知識(shí)。了解手工編程和利用設(shè)計(jì)器構(gòu)建菜單的差異,了解模態(tài)、非模態(tài)對(duì)話框的不同之處。
第6章介紹控件布局管理、窗口切分與?俊挝臋n與多文檔界面的實(shí)現(xiàn)方式。有了布局管理的知識(shí),就可以靈活高效地安排控件的位置并使之隨界面大小而動(dòng)態(tài)變化。大大簡(jiǎn)化了界面編程的強(qiáng)度。
第7章介紹事件系統(tǒng)的基本知識(shí)。窗體程序的一舉一動(dòng)全由事件驅(qū)動(dòng),鼠標(biāo)操作、鍵盤操作、定時(shí)發(fā)生的動(dòng)作、界面重繪等全是事件,有了事件概念并且適當(dāng)?shù)乩檬录幚頇C(jī)制編寫程序是界面編程的要點(diǎn)之一。
第8章講解二維繪圖系統(tǒng)。畫筆、畫刷的利用和圖形繪制是界面編程中不可或缺的內(nèi)容,坐標(biāo)變換和特殊填充方式體現(xiàn)了Qt二維繪圖功能的強(qiáng)大。
第9章介紹利用樣式表美化界面的方法。在Qt中利用類似于網(wǎng)頁(yè)CSS腳本的QSS腳本可以直接設(shè)定各種控件的大小、顏色、背景等屬性,極大地方便了界面的美化。
第10章給出3個(gè)編程實(shí)例——接金幣、俄羅斯方塊、游戲大廳界面。通過(guò)這些范例讓讀者進(jìn)一步了解界面編程所需要的綜合能力。
由于本書內(nèi)容廣泛,加上編寫時(shí)間倉(cāng)促,以及作者水平有限,書中可能有錯(cuò)誤及不合理之處,懇請(qǐng)讀者指正。
仇國(guó)巍
2017年1月
第3章初識(shí)Qt開(kāi)發(fā)框架
3.1Qt的歷史淵源 Qt是1991年由挪威的奇趣科技(Trolltech)公司開(kāi)發(fā)的跨平臺(tái)C++圖形用戶界面(GUI)應(yīng)用程序開(kāi)發(fā)框架。2008年,奇趣科技公司被諾基亞公司收購(gòu),Qt也因此成為諾基亞公司旗下的編程語(yǔ)言工具,曾稱霸一時(shí)的Symbian手機(jī)操作系統(tǒng)就是基于Qt開(kāi)發(fā)的。2012年,Qt被芬蘭軟件公司Digia收購(gòu)。 Qt最早在Linux系統(tǒng)上大放異彩,它是Linux著名的桌面系統(tǒng)KDE的開(kāi)發(fā)平臺(tái)。后來(lái)又被很多軟件公司用來(lái)開(kāi)發(fā)重量級(jí)產(chǎn)品,其中包括三維動(dòng)畫軟件Maya、辦公套件WPS、即時(shí)通信軟件Skype等。它既可以開(kāi)發(fā)GUI程序,也可用于開(kāi)發(fā)非GUI程序。 目前Qt在不同的行業(yè)中都取得了不小的成績(jī),例如能源、醫(yī)療、軍工和國(guó)防、汽車、游戲動(dòng)畫和視覺(jué)效果、芯片、消費(fèi)電子、工業(yè)自動(dòng)化、計(jì)算機(jī)輔助設(shè)計(jì)和制造等。以華為公司、中石油公司為代表的客戶已經(jīng)說(shuō)明了Qt實(shí)力的雄厚。 歷經(jīng)二十多年不斷發(fā)展進(jìn)步,Qt已經(jīng)發(fā)展成為一個(gè)完善的C++開(kāi)發(fā)框架,可以開(kāi)發(fā)出強(qiáng)大的、互動(dòng)的并且獨(dú)立于平臺(tái)的應(yīng)用程序。Qt的應(yīng)用程序可以在本地桌面、嵌入式和移動(dòng)主機(jī)系統(tǒng)上運(yùn)行,其具有的性能遠(yuǎn)遠(yuǎn)優(yōu)于其他跨平臺(tái)的應(yīng)用程序開(kāi)發(fā)框架。 Qt具有下列突出優(yōu)點(diǎn): 優(yōu)良的跨平臺(tái)特性。
Qt支持的操作系統(tǒng)包括Microsoft Windows、Apple Mac OS X、Linux/X11,Embedded Linux、Windows Embedded、RTOS以及手機(jī)上的Android、IOS等。 面向?qū)ο。Qt的良好封裝機(jī)制使得Qt的模塊化程度非常高,可重用性較好,對(duì)于用戶開(kāi)發(fā)來(lái)說(shuō)是非常方便的。Qt提供了一種稱為signal/slot(信號(hào)/槽)的通信機(jī)制,這使得各個(gè)元件之間的協(xié)同工作變得更為簡(jiǎn)單和安全。 豐富的 API。Qt包括多達(dá) 250 個(gè)以上的C++類,除了用于用戶界面開(kāi)發(fā),還可用于文件操作、數(shù)據(jù)庫(kù)處理、網(wǎng)絡(luò)通信、2D/3D圖形渲染、XML操作等。
3.2安裝Qt開(kāi)發(fā)系統(tǒng)〖*4/5〗
3.2.1Qt系統(tǒng)下載Qt系統(tǒng)可以在官方下載網(wǎng)站http://download.qt.io/archive或者中文的Qtcn開(kāi)發(fā)網(wǎng)http://www.qtcn.org上下載。 本書采用的是qt.opensource.windows.x86.mingw482_opengl.5.3.2.exe軟件包,也就是Qt 5.3.2版本,其官方下載界面如圖3.1所示。由于在Qt發(fā)展過(guò)程中,其結(jié)構(gòu)有時(shí)會(huì)有較大變動(dòng),因此在本書學(xué)習(xí)過(guò)程中,請(qǐng)盡量選用Qt 5.3或更新的版本。 圖3.1Qt系統(tǒng)官方下載界面 Qt本質(zhì)上是一套C++類庫(kù),用于編寫C++源程序。Qt本身沒(méi)有C++的編譯系統(tǒng),而是采用開(kāi)源的MinGW(基于gcc、gdb)或者微軟公司的msvc編譯系統(tǒng)。本書采用整合MinGW的軟件包,該軟件包無(wú)須微軟公司的VC 2012或VC 2013開(kāi)發(fā)環(huán)境的支持。圖3.2在Qt安裝界面上選擇組件 在安裝過(guò)程中有一步是選擇組件,這時(shí)一定要將Tools中的MinGW 4.8.2選中,如圖3.2所示。另外,在選擇軟件授權(quán)協(xié)議的界面,選擇LGPL協(xié)議(GNU寬通用公共許可證)即可。其他步驟可按默認(rèn)方式操作。安裝完成后,Qt類庫(kù)、集成開(kāi)發(fā)環(huán)境Qt Creator、官方例程以及MinGW系統(tǒng)就一并安裝好了。
3.2.2Qt Creator簡(jiǎn)介 除了可以用手工方式編寫基于Qt的程序代碼,也可以使用官方開(kāi)發(fā)的集成開(kāi)發(fā)環(huán)境Qt Creator。Qt Creator提供了圖形化的界面設(shè)計(jì)器Qt Designer,該工具提供了Qt基本的窗體部件,如QWidget(基本窗口)、QLabel(標(biāo)簽)、QPushButton(按鈕)等,可以在設(shè)計(jì)器中通過(guò)鼠標(biāo)直接拖曳這些窗口部件并將其布置到窗口界面中,從而實(shí)現(xiàn)所見(jiàn)即所得的設(shè)計(jì)。 Qt Creator啟動(dòng)界面如圖3.3所示。它的中間部分是主窗口,上部是菜單欄,左側(cè)工具欄主要是模式選擇器和一些常用按鈕。 圖3.3Qt Creator啟動(dòng)界面
1. 菜單欄(Menu Bar) 菜單欄包括以下8個(gè)菜單。 “文件”菜單: 包含新建、打開(kāi)、關(guān)閉項(xiàng)目和文件,打印文件和退出等基本功能。 “編輯”菜單: 包含撤銷、剪切、復(fù)制、查找等常用功能,在高級(jí)菜單中還有標(biāo)示空白符、折疊代碼、改變字體大小等功能。 “構(gòu)建”菜單: 包含構(gòu)建和運(yùn)行項(xiàng)目等相關(guān)的功能。 “調(diào)試”菜單: 包含調(diào)試程序等相關(guān)的功能。 “分析”菜單: 包含QML分析器、Valgrind內(nèi)存分析器等功能菜單。QML是Qt開(kāi)發(fā)團(tuán)隊(duì)創(chuàng)立的一種腳本語(yǔ)言,可以通過(guò)描述的方式創(chuàng)建窗體程序。QML分析器可以分析一段腳本執(zhí)行過(guò)程中出現(xiàn)的問(wèn)題。而Valgrind是一個(gè)免費(fèi)的工具包,用來(lái)檢測(cè)程序運(yùn)行時(shí)內(nèi)存泄露、越界等問(wèn)題。 “工具”菜單: 提供了快速定位菜單、版本控制工具菜單和界面編輯器菜單等。其中的“選項(xiàng)”菜單中包含Qt Creator各個(gè)方面的設(shè)置選項(xiàng),包括環(huán)境設(shè)置、快捷鍵設(shè)置、編輯器設(shè)置、幫助設(shè)置、Qt版本設(shè)置、Qt設(shè)計(jì)師設(shè)置和版本控制設(shè)置等。 “控件”菜單: 包含設(shè)置窗口布局的一些菜單項(xiàng),如全屏顯示和隱藏邊欄等。 “幫助”菜單: 包含Qt幫助、Qt Creator版本信息和插件管理等菜單項(xiàng)。
2. 模式選擇器( Mode Selector ) Qt Creator包含歡迎、編輯、設(shè)計(jì)、調(diào)試(Debug)、項(xiàng)目、分析和幫助6個(gè)模式,各個(gè)模式完成不同的功能。也可以使用快捷鍵來(lái)更換模式,對(duì)應(yīng)的快捷鍵依次是Ctrl+1~6。下面簡(jiǎn)單介紹主要的幾種模式。 編輯模式: 主要用來(lái)查看和編輯程序代碼,管理項(xiàng)目文件。Qt Creator的編輯器具有關(guān)鍵字特殊顏色顯示、代碼自動(dòng)補(bǔ)全、聲明定義間快捷切換、函數(shù)原型提示、Fl鍵快速打開(kāi)相關(guān)幫助和在項(xiàng)目中進(jìn)行查找等功能。 設(shè)計(jì)模式: 整合了Qt設(shè)計(jì)師的功能。可以在這里設(shè)計(jì)圖形界面,進(jìn)行部件屬性設(shè)置、信號(hào)和槽設(shè)置、布局設(shè)置等操作。 調(diào)試模式: Qt Creator默認(rèn)使用gdb進(jìn)行調(diào)試,支持設(shè)置斷點(diǎn)、單步調(diào)試和遠(yuǎn)程調(diào)試等功能,包含局部變量、監(jiān)視器、斷點(diǎn)、線程以及快照等查看窗口。 項(xiàng)目模式: 包含對(duì)特定項(xiàng)目的構(gòu)建設(shè)置、運(yùn)行設(shè)置、編輯器設(shè)置和依賴關(guān)系等頁(yè)面。構(gòu)建設(shè)置中可以對(duì)項(xiàng)目的版本、使用Qt的版本和編譯步驟進(jìn)行設(shè)置;編輯器設(shè)置中可以設(shè)置文件的默認(rèn)編碼。
3. 常用按鈕 Qt Creator啟動(dòng)界面左下角包含目標(biāo)選擇器、運(yùn)行按鈕、調(diào)試按鈕和構(gòu)建全部項(xiàng)目4個(gè)按鈕圖標(biāo)。目標(biāo)選擇器用來(lái)選擇要構(gòu)建哪個(gè)平臺(tái)的項(xiàng)目,這對(duì)于多個(gè)Qt庫(kù)的項(xiàng)目很有用。還可以選擇編譯項(xiàng)目的debug版本或release版本。運(yùn)行按鈕可以實(shí)現(xiàn)項(xiàng)目的構(gòu)建和運(yùn)行。調(diào)試按鈕可以進(jìn)入調(diào)試模式。構(gòu)建全部項(xiàng)目按鈕可以構(gòu)建所有打開(kāi)的項(xiàng)目。
3.3創(chuàng)建一個(gè)簡(jiǎn)單程序 本節(jié)以手工編碼和圖形化操作方式建立兩個(gè)同樣的“Hello Qt!”程序。 注意: 在建立項(xiàng)目時(shí),項(xiàng)目的路徑和名稱都不要使用中文。
3.3.1手工編碼方式 【例3.1】利用手工編碼方式建立“Hello Qt!”程序。 第1步,利用Qt Creator的菜單“文件→新建文件或項(xiàng)目”打開(kāi)新建對(duì)話框,選擇“其他項(xiàng)目→空的Qt項(xiàng)目”建立一個(gè)名為3_1的工程。這時(shí)工程中除了名為3_1.pro工程文件外無(wú)任何其他文件。 第2步,再次打開(kāi)新建對(duì)話框,選擇C++項(xiàng)目下的C++ Source File,添加一個(gè)C++源程序q1.cpp(名稱可以任。。 第3步,單擊打開(kāi)工程文件3_1.pro,在末尾行添加文字: QT +=widgets。這樣便可以在工程中使用可視化的部件。 第4步,在源程序q1.cpp中添加如下代碼: 1#include 2#include 3#include 4int main(int argc, char argv\[\]) 5{ 6QApplication a(argc,argv); 7QDialog w; 8QLabel label(&w); 9label.setText("Hello Qt!"); 10label.setGeometry(10,10,100,100); 11w.show(); 12return a.exec(); 13}圖3.4工程3_1運(yùn)行界面 至此,一個(gè)完整的Qt程序就完成了。
單擊運(yùn)行按鈕(圖標(biāo)為,對(duì)應(yīng)快捷方式為Ctrl+R鍵),即可得到圖3.4所示的窗體。 代碼說(shuō)明: 第1~3行包含了頭文件。其中2、3兩行說(shuō)明可使用對(duì)話框類和標(biāo)簽類。 第4行是C++中的main函數(shù),它有兩個(gè)參數(shù),用來(lái)接收命令行參數(shù)。 第6行新建QApplication類對(duì)象,用于管理應(yīng)用程序的各種設(shè)置,并執(zhí)行事件處理工作,任何一個(gè)Qt GUI程序都要有一個(gè)QApplication對(duì)象。該對(duì)象需要argc和argv兩個(gè)參數(shù)。 第7行新建一個(gè)QDialog對(duì)象,實(shí)現(xiàn)一個(gè)對(duì)話框界面。 第8行新建了標(biāo)簽QLabel對(duì)象,并將QDialog對(duì)象w作為參數(shù),表明對(duì)話框w是它的父窗口,也就是說(shuō)這個(gè)標(biāo)簽放在對(duì)話框窗口中。 第9行給標(biāo)簽設(shè)置要顯示的字符。 第10行設(shè)置標(biāo)簽相對(duì)于對(duì)話框的位置和大小,使用了函數(shù)void setGeometry(int x,int y,int w,int h),其中x、y設(shè)置標(biāo)簽在對(duì)話框中的坐標(biāo),w為寬,h為高。GUI控件都有這個(gè)函數(shù)。 第11行將對(duì)話框顯示出來(lái)。在默認(rèn)情況下,窗口部件對(duì)象是不可見(jiàn)的,要使用show函數(shù)讓它們顯示出來(lái)。 第12行的exec函數(shù)讓QApplication對(duì)象進(jìn)入事件循環(huán),這樣Qt應(yīng)用程序在運(yùn)行時(shí)便可以接收產(chǎn)生的事件,例如鼠標(biāo)單擊和鍵盤按下等事件。
3.3.2無(wú)UI的向?qū)Х绞?所謂UI是指程序界面描述文件,可用于可視化界面設(shè)計(jì)。 【例3.2】利用無(wú)UI的應(yīng)用程序向?qū)Ыⅰ癏ello Qt!”程序。 第1步,建立無(wú)UI的工程。 ……