## 6.2 Hello Qt
在這一節中,將通過一個“Hello Qt!”程序,向大家介紹 Qt4 程序編譯運行的流 程,并且將采用上面所述的 3 種方法分別介紹,使大家能夠對比學習。為什么選擇這個 “老套”的程序呢,大家可以看到它雖然簡單,卻是“麻雀雖小,五臟俱全”。基本上每個 講述編程的書籍開頭不是“Hello World”就是“Welcome You”,好多世界級的大師都這么 做,肯定是有道理的,并且這已經是講述編程的書籍的“約定俗成”了。
### 6.2.1 基本流程
1\. 成功安裝 Qt 4.5
2\. 正確配置環境變量(Windows 環境通常不需要)
3\. 書寫源代碼
將下面的源代碼保存至一個名為 helloqt.cpp 的文件,并把它放進一個名為 helloqt 的目錄中,你可以使用任何一種文本編輯器完成此項工作,比如 Windows 平臺的記事本, Linux 下的 vim,Mac OS X 下的 TextEdit。
4\. 生成項目文件
在命令行下,進入 helloqt 目錄,輸入如下命令,生成一個與平臺無關的項目文件 helloqt.pro:
```
qmake –project
```
5\.生成 makefile 文件
然后輸入如下命令,從這個項目文件生成一個與平臺相關的 makefile 文件:
```
qmake helloqt.pro
```
6\.運行 make 構建程序
在 X11 以及 Mac 下,鍵入 make;
在 Windows 上,如果使用的是開源版的 Qt,鍵入 mingw32-make.exe;如果使用的是商 業版的 Qt,則輸入 nmake;
7\. 運行程序
在 Windows 下,輸入 helloqt,并回車運行; 在 X11 下,輸入./helloqt;
在 Mac OS X 下,輸入 open helloqt.app
8\.結束程序
要結束該程序,可以直接單擊窗口標題上的關閉按鈕。
小貼士:這就是 Qt4 程序編譯運行的大致順序,上面的這個流程主要是采用命令行方式進 行的。如果你使用的是 Qt 的商業版和 Microsoft Visual C++作為開發環境,則需要使用 nmake 命令替代 make 命令。還可以通過.pro 文件創建一個 Visual C++工程文件,方法如 下:
```
qmake –project
qmake –tp vc helloqt.pro
```
然后,就可以使用 Visual C++打開生成的工程文件,繼續完成編譯運行的工作。
如果是在 Mac OS X 的 Xcode 里面使用 Qt,則可以打開命令行,輸入如下命令來生成一 個 Xcode 工程文件,繼而完成后面的工作:
```
qmake –spec macx-xcode helloqt.pro
```
最后這個程序的運行起來就像圖 6-1 所示的那樣。

圖 6-1 Hello Qt!運行效果
### 6.2.2 源碼分析
本實例實現一個“Hello Qt !”的例子,它是基于對話框的程序,界面上有一個按 鈕,上面的字符是“Hello Qt!”,單擊該按鈕,對話框關閉,程序退出。實例效果如圖所 示:
實現代碼如下:
```
#include <QApplication>
#include <QPushButton>
int main(int argc, char *argv[])
{
QApplication app(argc,argv);
QPushButton pushButton( QObject::tr("Hello Qt !") );
pushButton.show();
QObject::connect(&pushButton,SIGNAL(clicked()),&app,SLOT(quit()));
return app.exec();
}
```
第 1 行包含了 QApplication 的定義。Qt 的頭文件中最為重要的兩個是<QApplication>
和<QCoreApplication>。在本書后面的章節中,你會經常看到它們。所有 Qt GUI 應用程序 都需要包含<QApplication>這個文件,若使用的是非 GUI 應用程序,則需要包含
```
<QCoreApplication>。
```
小貼士:在 Qt4 中,對于每個 Qt 類,都有一個與該類同名并且采用大寫形式的頭文件,在 這個頭文件中包含了對該類的定義。
第 2 行包含了按鈕窗口部件的頭文件。
小貼士:在 Qt4 中,頭文件的包含可以采用類似于<QApplication>和<QPushButton>的形 式,也可以使用<qapplication.h>和<qpushbutton.h>的形式。為什么這么說呢,以 Windows 上安裝的 Qt4.5 為例,請進入你的安裝路徑下的 include 目錄,我的是 C:\Qt\2009.03\qt\include\QtGui,在這里你可以找到 QApplication 和 qapplication.h, 用記事本打開 QApplication 這個文件,你就會發現里面只有一行代碼: #include "qapplication.h"。
第 3 行創建了應用程序的入口,Qt 程序以一個 main()函數作為入口,它有 argc 和 argv 兩個參數。
第 5 行創建了一個 QApplication 對象,用來管理整個應用程序所用到的資源。每個 Qt 程序都必須有且只有一個 QApplication 對象。這個 QApplication 構造函數需要 argc 和 argv 作為參數,以支持程序的命令行參數。
第 6 行創建了一個 QPushButton 對象,它是一個窗口部件(widget),并把它的顯示文 本設置為“Hello Qt!”。
小貼士:在 Qt 和 UNIX 術語中,窗口部件(widget)通常是指用戶界面中的可視化元素, 比如按鈕、滾動條和菜單等都是窗口部件。該詞起源于 “window gadget”這個詞組,語義 有些類似于 Windows 系統中的“控件”(control)的含義,但又不盡相同。
第 7 行調用按鈕對象的 show()方法,將按鈕顯示出來。Qt4 在創建窗口部件的時候, 通常都是隱藏不顯示的,可以調用 show()方法來將它們顯示出來。這種做法還有一個好 處,就是我們可以先對窗口部件的屬性等進行設置,然后再顯示出來,從而防止閃爍現象的 出現。
第 8 行使用了 Qt 的信號/槽機制。這一機制是這樣運作的,Qt 的窗口部件可以通過發 射信號(signal)來通知應用程序,某個用戶動作已經發生或者是窗口部件的某種狀態發生 了變化,應用程序通過一個稱為槽( slot)的函數來做出回應和處理。以我們這個程序為 例,當用戶使用鼠標左鍵單擊那個 “Hello Qt!”按鈕時,該按鈕就會發射一個 clicked() 信號,根據我們的設置,QApplication 對象的 quit()槽負責響應這個信號,它執行退出應 用程序的操作。
這里大家不必深究這個內容,只需要知道“它們就是這么用的”即可。在本節的后面
會講述信號/槽機制的用法,更為深入的內容,可以閱讀第 13 章。
第 9 行調用 QApplication 的 exec()方法,程序進入事件循環,等待用戶的動作并適時 做出響應,這里的響應通常就是執行槽函數。 Qt 完成事件處理及顯示的工作后,退出應用 程序,并返回 exec()的值。
### 6.2.3 編譯運行
在 6.2.1 節里,我們已經總結了編譯運行 Qt 的方法,但恐怕還是有些晦澀難懂,為了 使讀者朋友看得更為清晰,現在把它圖文解說一下。以 Windows 平臺為例,操作系統是 Windows XP SP2 中文版,Qt 是 4.5 SDK,我們從第 4 步開始(前 3 步實在沒有什么好說 的,如有不明白的,請回頭去看前幾章,呵呵)。
依次點擊【開始】→【所有程序】→【Qt SDK by Nokia v2009.03(open source)】→【Qt Command Prompt】,啟動 Qt 命令行,如圖 6-2 所示,每次啟動時,命令行會自動為我 們配置好 Qt 所需的環境。

圖 6-2 啟動 Qt 命令行
接下來切換到你保存的程序文件目錄,我這里的情形如圖 6-3 所示

圖 6-3 進入程序文件所在的目錄
接下來輸入 qmake –project,生成項目文件,再輸入 dir/p 查看,發現生成的項目文 件名為 helloqt.pro。

圖 6-4 生成項目文件
然后輸入 qmake –helloqt.pro,生成 makefile 文件。
這之后再輸入 mingw32-make.exe,開始編譯程序,情形如圖 6-5 所示,編譯成功后,將在 debug 目錄下生成一個名為 helloqt.exe 的可執行文件。

圖 6-5 編譯程序
進入 debug 目錄,輸入 helloqt,運行它,程序的樣子與圖 6-1 所示相同。 好了,到此我們的第一個 Qt4 程序就順利完成了,它是基于手寫代碼,并且是采用命令行方式編譯運行的。這就是我們所說的第 1 種方法。
### 6.2.4 第 2 種方法
這里我們以 Qt Creator(關于 Qt Creator 的詳細使用方法,請見第 12 章)作為 IDE,流程如下:
1\. 成功安裝 Qt4.5
2\. 正確配置環境變量(Windows 環境通常不需要)
3\. 書寫源代碼
4\. 啟動 Qt Creator
首先依次點擊【開始】→【所有程序】→【Qt SDK by Nokia v2009.03(open source)】→【Qt Creator】,啟動 Qt Creator。
然后依次點擊主菜單的【Tools】→【Options...】,在彈出的如圖所示的對話框中選 中【Qt4】→【Qt Versions】,查看 Qt Creator 識別的 Qt4 的版本情況,如果符合你的實 際情形,就直接點擊【OK】按鈕退出;如果不符合,你可以對它進行增、刪、改,方法比較
簡單,根據屏幕的提示完成即可。
注意,這一步很重要,如果 Qt Creator 沒有正確識別你的 Qt4 所在的位置,那么接下 來的所有步驟都將變得沒有意義。

圖 6-6 查看并設置 Qt4 環境
5\.新建工程
依次點擊【File】→【New...】→【Projects】→【Empty Qt4 Project】,如圖 6-7 所示,點擊【OK】按鈕建立一個空的 Qt4 工程。

圖 6-7 新建 Qt4 工程
接下來彈出的對話框會要求你設置工程的名字和所在的目錄,并且會提示你不可采用 特殊的字符,如圖 6-8 所示,根據筆者的經驗,不要包含空格,最好不要包含中文字符, 切記!

圖 6-8 Qt 對于命名的要求
如圖 6-9 所示,輸入正確的路徑和工程名字(這里是 helloqt)后,點擊 Next 按鈕。

圖 6-9 正確的輸入工程名稱和目錄
接下來這一步沒有什么好說的,系統向你展示了即將創建的工程的信息,如圖 6-10 所 示,點擊 Finish 按鈕,這就生成了一個新的工程,如圖 6-11 所示。

圖 6-10 新工程的信息

圖 6-11 生成了一個新的工程
這時候的工程還是空的,我們需要向里面添加文件。有兩種方法,一是添加已經存在的,還有就是新建一個。
下面先說如何添加一個已經存在的文件。 在工程目錄上點擊鼠標右鍵,在彈出的上下文菜單上選擇 【Add Existing Files...】,如圖 6-12 所示。

圖 6-12 添加已有文件
然后找到你要添加的 helloqt.cpp 的位置,把它加入進去,這時候在工程目錄里面就 多了一項你剛才添加的文件,如圖 6-13 所示。

圖 6-13 加入已經制作好的文件
小貼士:在 Qt Creator 中對添加已有文件采取的是“不拷貝添加”的方式,即添加完成 后,Qt4 的工程并沒有把這個文件從原有的位置拷貝一份到工程目錄里面,而是添加了它的 相對路徑位置。這點可以通過添加文件完成后,查看 .pro 文件的內容看出來。在這一點上 Qt Creator 與 KDevelop 和 QDevelop 中有所不同,后兩者都可以設置添加的方式是不拷貝 添加還是拷貝添加。
我建議還是自己先手動把文件放置在工程目錄下面,然后再在 Qt Creator 中添加。一 方面便于統一管理工程文件,二來可以提高 Qt 應用程序的效率。
下面再介紹添加新文件的方法。
依次點擊【File】→【New...】→【C++】→【C++ Source File】,如圖 6-14 所示, 我們這里是要添加一個 C++實現文件,點擊【OK】按鈕,進入下一步的設置。

圖 6-14 新建一個 C++實現文件
在接下來的如圖 6-15 所示界面中,正確的輸入文件名字,這里是 helloqt.cpp,并選 擇工程的目錄,然后點擊 Next 按鈕進入下一步。

圖 6-15 輸入文件名
接下來,如圖 6-16 所示,選擇默認設置,把文件加入到 helloqt.pro 工程中,點擊Finish 按鈕。

圖 6-16 項目信息
這時,我們只是在工程里面加入了一個空的 C++實現文件,還需要添加內容。把 helloqt.cpp 源代碼加入到如圖 6-17 所示的屏幕右面的代碼編輯區內。

圖 6-17 新文件加入后的樣子
好了,編輯文件和設置工程的工作業已結束。接下來,就要開始編譯源程序了,首先 運行 qmake。依次點擊主菜單的【Build】→【Run qmake】,或者通過鼠標右鍵的上下文菜單來實現。
那么怎樣才能知道 qmake 運行成功與否呢?Qt Creator 為我們提供了一個直觀的查看 方式,當你運行 qmake 或者是 Build、Run 時,在 Qt Creator 的左下角會顯示一個如圖 6- 18 所示的運行狀態進度條顯示按鈕,如果編譯成功,它就會顯示為滿格的綠色;如果運行 不成功,或中途遇到 bug,它就會顯示為不滿格的紅色,并且會提示 bug 和 warning 的數 量。

圖 6-18 運行狀態顯示按鈕
在這個進度條按鈕上點擊一下,就會顯示出具體的狀態信息,如圖 6-19 所示,這個 Output 窗口顯示了命令運行的過程,最后一句 ”Exited with code 0”表示成功。

圖 6-19 運行 qmake 成功
接下來編譯程序,依次點擊主菜單的【Build】→【Build All Ctrl+Shift+B】,或者 通過鼠標右鍵的上下文菜單來實現,效果如圖 6-20 所示。

圖 6-20 編譯(build)成功
依次點擊主菜單的【Build】→【Run Ctrl+R】,或者通過鼠標右鍵的上下文菜單來實 現,程序運行的效果與圖 6-1 相同。
第 2 種方法的使用大致就是這樣。不管是多么復雜的程序,使用它的流程都是與此類 似的。
### 6.2.5 第 3 種方法
這種方法也有兩種常見的做法,一種是在單獨啟動的 Qt Designer 中設計程序界面, 制作完成后保存成.ui 文件(一種基于 XML 的文件格式),然后再在 IDE 中把它集成進來;
另外一種是直接在 IDE 中使用 Qt Designer,由于我們使用的 IDE 大都將 Qt Designer 的主要功能集成了進來,所以這兩種做法其實區別不大,就看大家的喜好了。
下面仍以 Qt Creator 為例,使用這種方法時,一般遵循如下步驟:
+ 創建窗體并在窗體中放置各種窗口部件
+ 設置窗口部件的屬性
+ 對窗體進行布局設計
+ 設置各個窗口部件的 Tab 順序
+ 創建信號和槽
+ 連接信號和槽
+ 編寫代碼(如果需要的話)
+ 編譯、鏈接、運行程序 1.建立新工程
依次點擊【File】→【New...】→【Projects】→【Qt4 Gui Application】,如圖 6- 14 所示,點擊【OK】按鈕進入下一步設置。

圖 6-21 建立新工程
接下來仍舊是設置項目的名稱和目錄位置,正確設置即可,我們這里仍舊是 helloqt, 如圖 6-22 所示,點擊【Next】按鈕進入下一步。

圖 6-22 設置項目的名稱和目錄位置
接下來需要設置你的應用程序想要包含的 Qt 模塊,當你選擇了某個模塊后,它的頭文 件就會在程序中被自動包含了。如圖 6-23 所示,其中 QtCore Module 和 QtGui Module 是 必需的,缺省已經選擇了。我們這個程序并不需要包含其他的功能,選擇缺省設置,點擊【Next】按鈕進入下一步。

圖 6-23 選擇需要的 Qt 模塊
下面我們需要設置應用程序的類型,這里是通過選擇你建立的類的基類來體現的,共 有 3 種選擇:QMainWindow、QWidget、QDialog。也就是說,我們的應用程序的骨干類是子 類化這 3 種類其中的一種。這里我們以選擇基類為 QWidget,其它選項選擇缺省值,如圖6-24 所示,點擊【Next】按鈕進入下一步。注意這里需要將 【Generate form】選項選上, 否則將不會產生.ui 文件,這就和第 2 種方法是一樣的了。

圖 6-24 設置應用程序的類型
接下來展示的是要建立的工程的基本信息。我們的工程由主要由 5 個文件組成: main.cpp、widget.h、widget.cpp、widget.ui 和 helloqt.pro。其中 main.cpp 是主程序 文件,其中主要包含了 main()函數,前面我們已經講到,它是應用程序的入口; widget.ui 是程序界面文件,它是基于 xml 格式的,它描述了界面的布局信息; widget.h 和 widget.cpp 是基于 widget.ui 產生的界面實體類;helloqt.pro 是工程文件,其中包含了 工程的基本信息,它能夠被 qmake 所識別。點擊【Finish】按鈕,就完成了工程的設置。

圖 6-25 生成的工程信息

圖 6-26 生成的工程概覽
生成的工程如圖 6-26 所示,如果想查看或修改某個文件的內容,在該文件上雙擊鼠標 左鍵即可在右面的代碼瀏覽和編輯區內實現。
2\.創建窗口部件并設置屬性
用鼠標左鍵雙擊 widget.ui 文件,Qt Creator 將把 Qt Designer 打開并集成到框架 內,如圖 6-27 所示,是不是很熟悉,與我們在第 5 章介紹的單獨啟動的 Qt Designer 并沒 有什么不一樣。

圖 6-27 集成 Qt Designer 的 Qt Creator 設置 Widget 的 WindowTitle 屬性為:Hello Qt!。在窗體上放置一個 Push Button 窗 體部件,并把它的 text 屬性設置為:Hello Qt!。然后手動調整一下 Widget 和 Button 的 大小,不必太費力氣,只要不是太難看就可。關于設置屬性的方法在第 5 章中已經有詳細的講述,這里不再贅述。最后設置完成的界面如圖 6-28 所示。

圖 6-28 初步設置好的界面
3\.設計布局和 Tab 順序
由于程序的界面元素比較少,我們選擇水平布局,再設置 Tab 順序,完成后的界面如 圖 6-29 所示。

圖 6-29 設置布局和 Tab 順序
4\.創建并連接信號與槽
按照第 5 章介紹的方法,按下 F4 鍵,拖動鼠標左鍵,選擇 pushButton 的 clicked()信 號,以及 Widget 的 close()槽,并連接它們,完成后的效果如圖 6-30 所示。

圖 6-30 創建并連接信號和槽
5\.編譯運行程序
依次執行 qmake、Build(或 Build All)、Run,程序運行后的效果如圖 6-31 所示。

圖 6-31 程序運行效果
估計讀者朋友也看出來了,這個程序運行的效果與前面的不完全一樣。這也正是我想 說明的,Qt Designer 并不是“為所欲為”的,比如這里我們就無法在其中設計出與第 1 種 手寫代碼完全一致的界面來,除非我們對其產生的代碼再進行手動修改。
實際上,在進行工程開發時,尤其是面對復雜的大型應用程序時,程序員完全采用手 寫代碼的時候很少見,而完全使用 Qt Designer 設計界面的情形也不多,更多情況下往往 是將兩者結合起來使用。但無論怎樣,第 1 種方法都是最基本的,只有對 Qt 的基本原理很 清楚,對 qmake 的基本語法掌握的很熟練,才能夠游刃有余的開發 Qt 應用程序。
- 第 1 章 走近 Qt
- 1.1 Qt 簡介
- 1.2 Qt 紀事概覽
- 1.3 Qt 套件的組成(以 Qt4.5 為準)
- 1.4 Qt 的授權
- 1.5 Qt 的產品
- 1.6 Qt 的服務與支持
- 1.7 Qt 的最新進展
- 1.8為什么選擇 Qt
- 1.9 問題與解答
- 1.10 總結與提高
- 第 2 章 Qt 的安裝與配置
- 2.1 獲取 Qt
- 2.2 協議說明
- 2.3 安裝 Qt
- 2.4 配置 Qt4 環境
- 2.5 問題與解答
- 2.6 總結與提高
- 第 3 章 Qt 編程基礎
- 3.1 標準 C++精講
- 3.2 Windows 編程基礎
- 3.3 Linux 編程基礎
- 3.4 Mac 編程基礎
- 3.5 問題與解答
- 3.6 總結與提高
- 第 4 章 Qt 4 集成開發環境
- 4.1 常見的 Qt IDE
- 4.2 Qt Creator
- 4.3 Eclipse
- 4.5 問題與解答
- 4.6 總結與提高
- 第 5 章 使用 Qt 基本 GUI 工具
- 5.1 使用 Qt Designer 進行 GUI 設計
- 5.2 使用 Qt Assistant 獲取在線文檔與幫助
- 5.3 使用 Qt Demo 學習 Qt 應用程序開發
- 5.4 問題與解答
- 5.5 總結與提高
- 第 6 章 Qt 4 程序開發方法和流程
- 6.1 開發方法
- 6.2 Hello Qt
- 6.3 幾個重要的知識點
- 6.4 問題與解答
- 6.5 總結與提高
- 第 7 章 對話框
- 7.1 QDialog 類
- 7.2 子類化 QDialog
- 7.3 快速設計對話框
- 7.4 常見內建(built in)對話框的使用
- 7.5 模態對話框與非模態對話框
- 7.6 問題與解答
- 7.7 總結與提高
- 第 8 章 主窗口
- 8.1 主窗口框架
- 8.2 創建主窗口的方法和流程
- 8.3 代碼創建主窗口
- 8.4 使用 Qt Designer 創建主窗口
- 8.5 中心窗口部件專題
- 8.6 Qt4 資源系統專題
- 8.7 錨接窗口
- 8.8 多文檔
- 8.9 問題與解答
- 8.10 總結與提高
- 第 9 章 Qt 樣式表與應用程序觀感
- 9.1 應用程序的觀感
- 9.2 QStyle 類的使用
- 9.3 樣式表概述
- 9.4 使用樣式表
- 9.5 問題與解答
- 9.6 總結與提高
- 第 10 章 在程序中使用.ui 文件
- 10.1 uic 的使用
- 10.2 Ui_YourFormName.h 文件的組成
- 10.3 編譯時加入處理.ui 文件的方法
- 10.4 運行時加入處理.ui 文件的方法
- 10.5 信號與槽的自動連接
- 10.6 問題與解答
- 10.7 總結與提高 本章主要講解了以下內容:
- 第 11 章 布局管理
- 11.1 基本概念和方法
- 11.2在 Qt Designer 中使用布局
- 11.3 基本布局實踐
- 11.4 堆棧布局
- 11.5 分裂器布局
- 11.6 自定義布局管理器
- 11.7 布局管理經驗總結
- 11.8 問題與解答
- 11.9 總結與提高
- 第 12 章 使用 Qt Creator
- 12.1 Qt Creator 概覽
- 12.2 Qt Creator 的組成
- 12.3 快捷鍵和常用技巧
- 12.4 Qt Creator 構建系統的設置
- 12.5 處理項目間依賴關系( Dependencies )
- 12.6 Qt 多版本共存時的管理
- 12.7 使用定位器在代碼間快速導航
- 12.8 如何創建一個項目
- 12.9 實例講解
- 12.10 使用 Qt Creator 調試程序
- 12.11 問題與解答
- 12.12 總結與提高
- 第 13 章 Qt 核心機制與原理
- 13.1 Qt 對標準 C++的擴展
- 13.2 信號與槽
- 13.3 元對象系統
- 13.4 Qt 的架構
- 13.5 Qt 的事件模型
- 13.6 構建 Qt 應用程序
- 13.7 總結與提高
- 附錄 A qmake 使用指南
- A.1 qmake 簡介
- A.2 使用 qmake
- 附錄 B make 命令
- B.1 命令解釋
- B.2 使用 make 自動構建
- 附錄 C Qt 資源
- C.1Qt 官方資源
- C.2 Qt 開發社區