Qt 深入淺出
經(jīng)常有人問(wèn)哪里有學(xué)習(xí)Qt的資料,Qt的教程,怎么才能入門等等,或者抱怨說(shuō)中文的信息太少。其實(shí)網(wǎng)上有很多關(guān)于Qt的學(xué)習(xí)資料,今天在這里總結(jié)一下,希望各位想學(xué)習(xí)Qt的同學(xué),各取所需,早日從入門到精通!
Part 1: 新手上路
Qt 官方學(xué)習(xí)教程
Qt 官方學(xué)習(xí)教程包含了3部分,包括如何學(xué)習(xí)Qt,如何逐步創(chuàng)建一個(gè)地址簿應(yīng)用以及如何編寫(xiě)Qt Widget。教程由淺入深,Qt初學(xué)者必讀
我們假定您已了解 C++, 并將用于 Qt 開(kāi)發(fā)。有關(guān)將 Qt 與其他編程語(yǔ)言一起使用的更多信息,請(qǐng)參見(jiàn) Qt 網(wǎng)站。。。。。
本教程介紹了使用 Qt 跨平臺(tái)框架的 GUI 編程。在學(xué)習(xí)過(guò)程中,我們將了解部分 Qt 基本技術(shù),如Widget 和布局管理器,容器類,信號(hào)和槽,輸入和輸出設(shè)備等。。
Widget 是使用 Qt 編寫(xiě)的圖形用戶界面 (GUI) 應(yīng)用程序的基本生成塊。每個(gè) GUI 組件,如按鈕、標(biāo)簽或文本編輯器,都是一個(gè) widget ,并可以放置在現(xiàn)有的用戶界面中或作為單獨(dú)的窗口顯示。每種類型的組件都是由 QWidget 的特殊子類提供的,而 QWidget 自身又是 QObject 的子類。
Qt 學(xué)習(xí)之路:
來(lái)自于FinderCheng的Qt 學(xué)習(xí)之路。簡(jiǎn)介:在本系列文章中,F(xiàn)inderCheng使用Qt4進(jìn)行C++ GUI的開(kāi)發(fā)。我是參照著《C++ GUI Programming with Qt4》一書(shū)進(jìn)行學(xué)習(xí)的。其實(shí),我也只是初學(xué)Qt4,在這里將這個(gè)學(xué)習(xí)筆記記下來(lái),希望能夠方便更多的朋友學(xué)習(xí)Qt4。我是一個(gè)Java程序員,感覺(jué) Qt4的一些命名規(guī)范以及約束同Java有異曲同工之妙,因而從Java遷移到Qt4似乎困難不大。不過(guò),這也主要是因?yàn)镼t4良好的設(shè)計(jì)等等。
Qt是一個(gè)著名的C++庫(kù)——或許并不能說(shuō)這只是一個(gè)GUI庫(kù),因?yàn)镼t十分龐大,并不僅僅是GUI。使用Qt,在一定程序上你獲得的是一個(gè)“一站式”的服務(wù):不再需要研究STL,不再需要C++的 ,因?yàn)镼t有它自己的QString等等。或許這樣說(shuō)很偏激,但Qt確實(shí)是一個(gè) “偉大的C++庫(kù)”。
任何編程技術(shù)的學(xué)習(xí)第一課基本上都會(huì)是Hello, world!,我也不想故意打破這個(gè)慣例——照理說(shuō),應(yīng)該首先回顧一下Qt的歷史,不過(guò)即使不說(shuō)這些也并無(wú)大礙。
下面來(lái)逐行解釋一下前面的那個(gè)Hello, world!程序,盡管很簡(jiǎn)單,但卻可以對(duì)Qt程序的結(jié)構(gòu)有一個(gè)清楚的認(rèn)識(shí)。現(xiàn)在再把代碼貼過(guò)來(lái):
所謂信號(hào)槽,簡(jiǎn)單來(lái)說(shuō),就像是插銷一樣:一個(gè)插頭和一個(gè)插座。怎么說(shuō)呢?當(dāng)某種事件發(fā)生之后,比如,點(diǎn)擊了一下鼠標(biāo),或者按了某個(gè)按鍵,這時(shí),這個(gè)組件就 會(huì)發(fā)出一個(gè)信號(hào)。就像是廣播一樣,如果有了事件,它就漫天發(fā)聲。這時(shí),如果有一個(gè)槽,正好對(duì)應(yīng)上這個(gè)信號(hào),那么,這個(gè)槽的函數(shù)就會(huì)執(zhí)行,也就是回調(diào)。就像 廣播發(fā)出了,如果你感興趣,那么你就會(huì)對(duì)這個(gè)廣播有反應(yīng)。干巴巴的解釋很無(wú)力,還是看代碼:
顧名思義,絕對(duì)定位就是使用最原始的定位方法,給出這個(gè)組件的坐標(biāo)和長(zhǎng)寬值。這樣,Qt就知道該把組件放在哪里,以及怎么設(shè)置組件的大小了。但是這樣做的 一個(gè)問(wèn)題是,如果用戶改變了窗口大小,比如點(diǎn)擊了最大化或者拖動(dòng)窗口邊緣,這時(shí),你就要自己編寫(xiě)相應(yīng)的函數(shù)來(lái)響應(yīng)這些變化,以避免那些組件還只是靜靜地呆 在一個(gè)角落。或者,更簡(jiǎn)單的方法是直接禁止用戶改變大小。
今天來(lái)說(shuō)一下有關(guān)Qt API文檔的使用。因?yàn)镼t有一個(gè)商業(yè)版本,因此它的文檔十分健全,而且編寫(xiě)良好。對(duì)于開(kāi)發(fā)者來(lái)說(shuō),查看文檔時(shí)開(kāi)發(fā)必修課之一——沒(méi)有人能夠記住那么多API的使用!
首先說(shuō)明一點(diǎn),在C++ GUI Programming with Qt4, 2nd中,這一章連同以后的若干章一起,完成了一個(gè)比較完整的程序——一個(gè)模仿Excel的電子表格。不過(guò)這個(gè)程序挺大的,而且書(shū)中也沒(méi)有給出完整的源代 碼,只是分段分段的——我不喜歡這個(gè)樣子,我想要看到我寫(xiě)出來(lái)的是什么東西,這是最主要的,而不是慢慢的過(guò)上幾章的內(nèi)容才能看到自己的作品。
Qt是分模塊的,記得我們建工程的時(shí)候就會(huì)問(wèn)你,使用哪些模塊?QtCore?QtGui?QtXml?等等。這里,我們引入QtGui,它包括了 QtCore和QtGui模塊。不過(guò),這并不是最好的做法,因?yàn)镼tGui文件很大,包括了GUI的所有組件,但是很多組件我們根本是用不到的——就像 Swing的import,
槽函數(shù)和 普通的C++成員函數(shù)沒(méi)有很大的區(qū)別。它們也可以使virtual的;可以被重寫(xiě);可以使public、protected或者private 的;可以由其它的C++函數(shù)調(diào)用;參數(shù)可以是任何類型的。如果要說(shuō)區(qū)別,就是,槽函數(shù)可以和一個(gè)信號(hào)相連接,當(dāng)這個(gè)信號(hào)發(fā)生時(shí),它可以被自動(dòng)調(diào)用。
前面說(shuō)過(guò),Qt使用的是自己的預(yù)編譯器,它提供了對(duì)C++的一種擴(kuò)展。利用Qt的信號(hào)槽機(jī)制,就可以把彼此獨(dú)立的模塊相互連接起來(lái),不需要實(shí)現(xiàn)知道模塊的任何細(xì)節(jié)。為了達(dá)到這個(gè)目的,Qt提出了一個(gè)Meta-Object系統(tǒng)。它提供了兩個(gè)關(guān)鍵的作用:信號(hào)槽和內(nèi)省。
盡管Qt提供了很方便的快速開(kāi)發(fā)工具QtDesigner用來(lái)拖放界面元素,但是現(xiàn)在我并不打算去介紹這個(gè)工具,原因之一在于我們的學(xué)習(xí)大體上是依靠手工編寫(xiě)代碼,過(guò)早的接觸設(shè)計(jì)工具并不能讓我們對(duì)Qt的概念突飛猛進(jìn)
在前面的QMainWindow的基礎(chǔ)之上,我們開(kāi)始著手建造我們的應(yīng)用程序。雖然現(xiàn)在已經(jīng)有一個(gè)框架,但是,確切地說(shuō)我們還一行代碼沒(méi)有寫(xiě)呢!下面的工作就不那么簡(jiǎn)單了!在這一節(jié)里面,我們要為我們的框架添加菜單和工具條。
前面一節(jié)我們已經(jīng)把QAction添加到菜單和工具條上面。現(xiàn)在我們要添加一些圖片美化一下,然后把信號(hào)槽加上,這樣,我們的action就可以相應(yīng)啦!
今天的內(nèi)容主要還是繼續(xù)完善前面的那個(gè)程序。我們要為我們的程序加上一個(gè)狀態(tài)欄。
下面還是按照我們的進(jìn)度,從Qt的標(biāo)準(zhǔn)對(duì)話框開(kāi)始說(shuō)起。所謂標(biāo)準(zhǔn)對(duì)話框,其實(shí)就是Qt內(nèi)置的一些對(duì)話框,比如文件選擇、顏色選擇等等。今天首先介紹一下QFileDialog。
繼續(xù)來(lái)說(shuō)Qt的標(biāo)準(zhǔn)對(duì)話框,這次說(shuō)說(shuō)QColorDialog。這是Qt提供的顏色選擇對(duì)話框。
程序?qū)懙亩嗔耍銜?huì)發(fā)現(xiàn)幾乎所有的Qt類的構(gòu)造函數(shù)都會(huì)有一個(gè)parent參數(shù)。這個(gè)參數(shù)通常是QObject* 或者是 QWidget* 類型的。
這次來(lái)說(shuō)一下QMessageBox以及類似的幾種對(duì)話框。其實(shí),我們已經(jīng)用過(guò)QMessageBox了,就在之前的幾個(gè)程序中。
這是Qt標(biāo)準(zhǔn)對(duì)話框的最后一部分。正如同其名字顯示的一樣,QInputDialog用于接收用戶的輸入。
Part 2: 進(jìn)階學(xué)習(xí)
Qt4 學(xué)習(xí)筆記
來(lái)自臺(tái)灣的caterpillar,Qt4 學(xué)習(xí)筆記由淺入深,分門別類的介紹了Qt4 中的許多特性,如事件處理,常用圖型元件,常用 API,檔案處理,拖放(Drag & Drop)與剪貼,多執(zhí)行緒(Multithreading)很多內(nèi)容,是進(jìn)一步學(xué)習(xí)Qt的極好教程
Qt 開(kāi)發(fā)實(shí)例
這里我們將會(huì)構(gòu)建所能想到的最簡(jiǎn)單和最直觀的音樂(lè)播放器,給用戶提供另一個(gè)選擇。 從蘋(píng)果的新款iPod Shuffle吸取一些靈感,只提供最基本的控制功能。
如果說(shuō)有一種工具非常需要GUI,那就是FFMPEG。FFMPEG是一個(gè)十分優(yōu)秀的命令行應(yīng)用程序,它可以將視頻和電影文件從一種格式轉(zhuǎn)換為另一種格式。
這個(gè)應(yīng)用程序就是一個(gè)RSS閱讀器,它允許用戶添加自己的種子,列出該種子上的內(nèi)容,然后讓用戶在主應(yīng)用程序自帶的一個(gè)瀏覽器窗口中閱讀這些內(nèi)容。
Qt Graphics View詳解
來(lái)自清源游民的Qt筆記,詳解介紹了Qt Graphics View中各個(gè)對(duì)象的概念和使用方法。對(duì)于Graphics View的學(xué)習(xí)大有裨益。
Graphics View提供了一個(gè)界面,它既可以管理大數(shù)量的定制2D graphical items,又可與它們交互,有一個(gè)view widget可以把這些項(xiàng)繪制出來(lái),并支持旋轉(zhuǎn)與縮放。
Graphics View基于笛卡爾坐標(biāo)系。item在場(chǎng)景中的位置與幾何形狀通過(guò)x,y坐標(biāo)表示。當(dāng)使用未經(jīng)變形的視圖來(lái)觀察場(chǎng)景時(shí),場(chǎng)景中的一個(gè)單位等于屏幕上的一個(gè)像素。
QGraphicsView通過(guò)QGraphicsView::setMatrix()支持同QPainter一樣的仿射變換,通過(guò)對(duì)一個(gè)視圖應(yīng)用變換,你可以很容易地支持普通的導(dǎo)航特性如縮放與旋轉(zhuǎn)。
關(guān)于Qt編程的書(shū)籍
接下來(lái)當(dāng)你學(xué)習(xí)了上面的相關(guān)內(nèi)容后,就可以開(kāi)始閱讀Qt編程的書(shū)籍進(jìn)行系統(tǒng)的學(xué)習(xí)了。當(dāng)然,書(shū)也不一定要從頭到尾閱讀一遍,用時(shí)拿出來(lái)學(xué)習(xí)和參考也很不錯(cuò)
本書(shū)詳細(xì)講述了用最新的Qt版本進(jìn)行圖形用戶界面應(yīng)用程序開(kāi)發(fā)的各個(gè)方面。前5章主要涉及Qt基礎(chǔ)知識(shí),后兩個(gè)部分主要講解Qt的中高級(jí)編程,包括布局管 理、事件處理、二維/三維圖形、拖放、項(xiàng)視圖類、容器類、輸入/輸出、數(shù)據(jù)庫(kù)、多線程、網(wǎng)絡(luò)、XML、國(guó)際化、嵌入式編程等內(nèi)容。對(duì)于本書(shū)講授的大量 Qt4編程原理和實(shí)踐,都可以輕易將其應(yīng)用于Qt4.4、Qt4.5以及后續(xù)版本的Qt程序開(kāi)發(fā)過(guò)程中。
Part3:深入理解
Inside Qt 系列
QKevin所著,通過(guò)剖析Qt源代碼,深入淺出的解釋了Qt中的許多機(jī)制,了解Qt內(nèi)部是如何 work 的。著實(shí)為想深入了解Qt的開(kāi)發(fā)者提供了很好的學(xué)習(xí)機(jī)會(huì)。如果你已經(jīng)學(xué)習(xí)了上面的內(nèi)容并且熟練掌握Qt編程,那么大力推薦這一系列文章!
寫(xiě)了這么多年的程序,除了留下很多 code (其中有很多是garbage)之外,再?zèng)]有其它東西,或許我該寫(xiě)點(diǎn)兒什么了,寫(xiě)一些關(guān)于我的工作的東西,自己所了解的技術(shù),也把自己在工作過(guò)程中新學(xué)習(xí)的一些東西放在這兒,就算是為了以后做一個(gè)參考。
QObject 這個(gè) class 是 QT 對(duì)象模型的核心,絕大部分的 QT 類都是從這個(gè)類繼承而來(lái)。這個(gè)模型的中心特征就是一個(gè)叫做信號(hào)和槽(signal and slot)的機(jī)制來(lái)實(shí)現(xiàn)對(duì)象間的通訊,
我們知道,在C++中,幾乎每一個(gè)類(class)中都需要有一些類的成員變量(class member variable),在通常情況下的做法如下:
在 QT 4.4 中,類成員變量定義方法的出發(fā)點(diǎn)沒(méi)有變化,只是在具體的實(shí)現(xiàn)手段上發(fā)生了非常大的變化,下面具體來(lái)看。
接上節(jié),讓我們來(lái)看看這個(gè) QObjectPrivate 和 QObject 是如何關(guān)聯(lián)在一起的。
從本節(jié)開(kāi)始,我們講解 QT Meta-Object System 的功能,以及實(shí)現(xiàn)。在使用 Qt 開(kāi)發(fā)的過(guò)程中,大量的使用了 signal 和 slot. 比如,響應(yīng)一個(gè) button 的 click 事件,我們一般都寫(xiě)如下的代碼:
元對(duì)象編譯器用來(lái)處理QT 的C++擴(kuò)展,moc 分析C++源文件,如果它發(fā)現(xiàn)在一個(gè)頭文件(header file)中包含Q_OBJECT 宏定義,然后動(dòng)態(tài)的生成另外一個(gè)C++源文件
信號(hào)和 槽是用來(lái)在對(duì)象間通訊的方法,當(dāng)一個(gè)特定事件發(fā)生的時(shí)候,signal會(huì)被 emit 出來(lái),slot 調(diào)用是用來(lái)響應(yīng)相應(yīng)的 signal 的。
前面我們介紹了 Meta Object 的基本功能,和它支持的最重要的特性之一:Signal & Slot的基本功能。現(xiàn)在讓我們來(lái)進(jìn)入 Meta Object 的內(nèi)部,看看它是如何支持這些能力的。
我們來(lái)看一下QMetaObject的定義,我們先看一下QMetaObject對(duì)象中包含的成員數(shù)據(jù)。
我們都知道,把一個(gè)signal和slot連接起來(lái),需要使用QObject類的connect方法,它的作用就是把一個(gè)object的signal和另外一個(gè)object的slot連接起來(lái),以達(dá)到對(duì)象間通訊的目的。
當(dāng)我們寫(xiě)下一下emit signal代碼的時(shí)候,與這個(gè)signal相連接的slot就會(huì)被調(diào)用,那么這個(gè)調(diào)用是如何發(fā)生的呢?讓我們來(lái)逐一解開(kāi)其中的謎團(tuán)。
很多C/C++初學(xué)者常犯的一個(gè)錯(cuò)誤就是,使用malloc、new分配了一塊內(nèi)存卻忘記釋放,導(dǎo)致內(nèi)存泄漏。Qt的對(duì)象模型提供了一種Qt對(duì)象之間的父 子關(guān)系..
首先,讓我們來(lái)看看Qt/e的系統(tǒng)結(jié)構(gòu)介紹:Qt for destop Linux 和 Qt for Embedded Linux 最大的區(qū)別就在于他們所依賴的底層顯示基礎(chǔ)的不同,這也就導(dǎo)致了他們?cè)隗w系結(jié)構(gòu)上的差異。
本輸入法設(shè)計(jì)指南針對(duì)Qt for Embedded Linux 4.5.1,并且以中文輸入法為例做說(shuō)明,并且本文只是側(cè)重于說(shuō)明Qt/Embedded對(duì)輸入法的支持接口,
前面我們介紹了Qte輸入法的基本設(shè)計(jì)思路,以及一個(gè)最簡(jiǎn)單的例子,那么,Qte的輸入法是如何工作的呢?本節(jié)我們就來(lái)看一下Qte的源代碼,一起來(lái)解開(kāi)這個(gè)謎團(tuán)。
Part 4:移動(dòng)平臺(tái)開(kāi)發(fā)
Symbian S60
Forum Nokia Qt for Mobile Developers training
09年10月21至23號(hào),某人參加了諾基亞在北航舉辦的Qt開(kāi)發(fā)培訓(xùn)。培訓(xùn)師是來(lái)自于芬蘭的Niemi Petri,英語(yǔ)比好多芬蘭人要好,課程講得深入淺出,很好理解。課程內(nèi)容涉及Qt的基本知識(shí),以及Qt在S60和Maemo上的開(kāi)發(fā)。下面是培訓(xùn)的PPT和作業(yè)以及演示代碼。
Maemo
轉(zhuǎn)自:http://www.qteverywhere.com/learnqt