## 3.2 Windows 編程基礎
### 3.2.1 你需要掌握的技能
下面是筆者總結的在 Windows 下做開發需要掌握的一些基本技能,這些都是在實際工 作中經常會用到的,在后面的章節中,我們有重點的講解相關內容,但這并不是全部 。
+ 了解 Windows 系統各個版本的特點,能夠根據需求選用合適的版本;
+ 熟悉 Windows 的運行機理和編程模式
+ 能夠熟練配置環境變量,了解注冊表的功用,能夠修改注冊表項
+ 能夠熟練配置網絡連接,包括局域網和 Internet
+ 掌握常見的 DOS 命令,熟悉命令行的使用
+ 能夠熟練使用 MSDN,獲取幫助
+ 能夠熟練使用一種代碼編輯器,如記事本、 emacs 等,推薦掌握 Mingw 和 Visual Studio 的使用
+ 了解 Windows 系統下打包軟件的常用方法,掌握至少一種打包軟件的使用
### 3.2.2 Windows 運行機理
要想熟練掌握 Windows 應用程序的開發,我們首先需要理解 Windows 平臺下程序運行 的內部機制。
1\.API 與 SDK
我們在編寫標準 C 程序的時候,經常會調用各種庫函數來輔助完成某些功能:初學者 使用得最多的庫函數就是 printf 了,這些庫函數是由你所使用的編譯器廠商所提供的。在 Windows 平臺下,也有類似的函數可供調用。不同的是,這些函數是由 Windows 操作系統本 身提供的。
Windows 操作系統提供了各種各樣的函數,以方便我們開發 Windows 應用程序。這些函 數是 Windows 操作系統提供給應用程序編程的接口( Application Programming Interface),簡稱為 API 函數。我們在編寫 Windows 程序時所說的 API 函數,就是指系統 提供的函數,所有主要的 Windows 函數都在 Windows.h 頭文件中進行了說明。
我們經常聽到 Win32 SDK 開發、Qt SDK 開發等等說法。那么什么是 SDK 呢?SDK 的全 稱是 Software Development Kit,中文譯為軟件開開發包。比如我們現在要開發與短信貓 相關的通信程序,在購買短信貓的同時,廠商會提供短信貓的 SDK 開發包,以方便我們對 短信貓的編程操作。這個開發包通常都會包括短信貓的 API 函數庫、幫助文檔、使用手 冊、輔助工具等資源。也就是說, SDK 實際上就是開發所需資源的一個集合。
需要明確的是,API 和 SDK 是一種廣泛使用的專業術語,并沒有專指某一種特定的 API 和 SDK。
Windows 操作系統提供了 1000 多種 API 函數,作為開發人員,要全部記住這些函數調 用的語法幾乎是不可能的。那么我們如何才能更好的去使用和掌握這些函數呢?答案是熟練 使用 MSDN,我們將在后面詳細為大家介紹。
2\.窗口和句柄
(1) 窗口
窗口是 Windows 應用程序中一個非常重要的元素,一個 Windows 應用程序至少要有一 個窗口,稱為主窗口。窗口是指屏幕上的一塊矩形區域,是 Windows 應用程序與用戶進行 交互的接口。利用窗口,可以接收用戶的輸入以及顯示輸出。
一個應用程序窗口通常都包含標題欄、菜單欄、系統菜單、最小化框、最大化框、可 調邊框,有的還有滾動條。一個典型的窗口如圖所示。

圖 3-1 一個典型的窗口
窗口可以分為客戶區和非客戶區,客戶區是窗口的一部分,應用程序通常在客戶區中 顯示文字或者繪制圖形。標題欄、菜單欄、系統菜單、最小化框和最大化框、可調邊框統稱 為窗口的非客戶區,它們由 Windows 系統來管理,而應用程序則主要管理客戶區的外觀及 操作。
窗口可以有一個父窗口,有父窗口的窗口稱為子窗口。除了圖所示類型的窗口之外, 對話框和消息框也是一種窗口。在對話框上通常還包含許多子窗口,這些子窗口的形式有按 鈕、單選按鈕、復選框、組框、文本編輯框等。
此外,我們在啟動 Windows 系統后,看到的桌面也是一個窗口,稱為桌面窗口,是位 于最上層的窗口,由 Windows 系統創建和管理。
(2) 句柄
下面再說說句柄(handle)。Windows 具有很強的面向對象特性。Windows 對象有很 多,譬如桌面、讀取所使用的程序等等。那么,如何區分這些東西呢?答案是使用句柄。句 柄是引用不同 Windows 對象的方式。可以使用 Windows 的句柄、文件的句柄、分配內存的 句柄、圖像的句柄等等。系統在創建這些資源時會為它們分配內存,并返回標識這些資源的 標識號,這就是句柄。實際上我們也可以將這些句柄看作指針。
在使用句柄之前,必須先創建它們,當不再使用時,應當及時銷毀它們。如果不銷毀 它們,最終將導致資源泄露(resource leak),資源泄露有可能導致系統崩潰,所以,務 必確保在適當的時候銷毀不再使用的句柄。
在 windows 應用程序中,窗口是通過窗口句柄( HWND)來標識的。我們要對某個窗口 進行操作,首先就要得到這個窗口的句柄,這就是窗口和句柄的聯系。
3\.消息與消息隊列
Windows 程序設計是一種基于消息的事件驅動方式的設計模式,完全不同于傳統的 DOS
方式的程序設計方法。在 Windows 中,編程的骨架都是響應和發送消息。例如,當用戶在
窗口中畫圖的時候,按下鼠標左鍵,此時操作系統會感知這一事件,于是將這個事件包裝成 一個消息,投遞到應用程序的消息隊列中,然后應用程序從消息隊列中取出消息并響應。在
這個處理過程中,操作系統也會給應用程序 “發送消息”。所謂“發送消息”,實際上是 操作系統調用程序中一個專門處理消息的函數,稱為 “窗口過程”。
(1) 消息
在 windows 程序中,消息是由 MSG 結構體來表示的。MSG 結構體的定義如下:
```
typedef struct tagMSG
{
HWND hwnd;
UINT message;
WPARAM wParam;
LPARAM lParam;
DWORD time;
POINT pt;
}MSG;
```
該結構體中各成員變量的含義如下:
hwnd 表示消息所屬的窗口。我們開發的程序都是窗口應用程序,消息一般都是與某個 窗口相關聯的。在 Windows 程序中,用 HWND 類型的變量來標識窗口。
message 變量指定了消息的標識符。在 Windows 中,消息是由一個數值來表示的,不同 的消息對應不同的數值。但是由于數值不便于記憶,所以 Windows 將消息對應的數值定義 為 WM_XXX 宏(WM 是 Window Message 的縮寫)的形式,XXX 對應某種消息的英文拼寫的大 寫形式。例如,鼠標左鍵按下的消息是 WM_LBUTTONDOWN,鍵盤按下消息是 WM_KEYDOWN,字 符消息是 WM_CHAR 等等。在程序中,我們通常都是用 WM_XXX 宏的形式來使用消息的。
此外,我們可以定義自己的消息,并給窗口發送這些消息,您完全不用擔心如何使這 些消息與代碼聯系起來,因為這是應用程序框架的事情。但是另一方面,這也在一定程度上 固定了程序設計上的一些結構。
wParam 和 lParam 用于指定消息的其他附加信息。比如,當我們收到一個字符消息的時 候,message 成員變量的值就是 WM_CHAR,但用戶輸入的是那些字符,就由 wParam 和 lParam 來說明。wParam、lParam 表示的信息隨消息的不同而有變化。
time 和 pt 分別表示消息投遞到消息隊列的時間和鼠標的當前位置。
(2) 消息隊列
每一個 Windows 應用程序開始執行后,系統都會為該程序創建一個消息隊列,這個消 息隊列用來存放該程序創建的窗口的消息。 Windows 將產生的消息依次放入消息隊列中,而 應用程序則通過消息循環不斷從隊列中取出消息,進行響應。這種消息機制,就是 Windows
程序運行的基本機制。
4\.窗口句柄和消息 現在我們將消息與句柄聯系起來。假如有一個窗口,且擁有該窗口的一個句柄(稱作一個 HWND),我們命名該句柄為 your_HWND。假設因為其他的窗口剛剛從該窗口上移走,那么操作系統希望重繪這個窗口。Windows 將傳遞如下所示消息:
```
PostMessage(your_HWND,WM_PAINT,0,0);
```
這個函數通過句柄 your_HWND 給窗口發送了一條繪制消息。最后兩個參數用作消息的額外信息,暫時可以不必深究它們的具體細節。
現在,應用程序中有一個函數用一個龐大的 case 語句來處理所有信息。例如:
```
void HandleTheMessage()
{
switch(Message)
{
case WM_PAINT:
DrawWindow();
break;
case WM_KEYDOWN:
break;
......
}
}
```
以上就是 Windows 中的消息和句柄的大致工作過程。了解這些后原理后,下面就可以
學習一下有關主程序以及窗口創建的知識。
5\.主程序-WinMain 函數
在 windows 操作系統下,用 C 或者 C++來編寫 MS-DOS 應用程序時,最起碼要有一個 main 函數。當用戶運行該應用程序時,操作系統會自動調用 main。但當編寫 Windows 應用 程序時,就一定要有 WinMain 函數,因為當用戶運行該程序時,操作系統首先調用程序中 的 WinMain 函數。該函數一般用來完成某些特殊的任務,其中最重要的任務就是要創建該 應用程序的“主窗口”。許多 Windows 集成開發環境,包括使用 Microsoft MFC 類庫的 Visual C++,都通過隱藏 WinMain 函數及構造消息-控制機制來簡化編程。雖然使用 MFC 編程不再需要過多關注 WinMain 函數,但是弄清楚操作系統與程序之間的這種關系是最基 本的要求。
注意,有關于 Win32 API 編程基礎的內容,大家可以參看候俊杰著的《深入淺出 MFC(第二版)》一書。
6\.創建窗口
Windows 窗口在創建之前,其屬性必須設定好,所謂屬性包括類的名字、圖標、光標及窗口過程處理函數等屬性。為了設定這些屬性, Windows 要求注冊窗口類,一經注冊,就可 以創建更多的同類窗口,無需再次注冊。窗口類僅僅定義了窗口的特征,所有創建窗口的對象都用窗口類來創建窗口。程序必須在產生窗口前先利用 API 函數 RegisterClass 設定屬 性,這一個過程就是注冊窗口類。
窗口注冊完之后,就可以創建相應的窗口。 注冊窗口時,必須給函數傳遞一個指針,這個指針指向一個包含窗口屬性的結構。該結構有 2 個版本,WNDCLASS 和 WNDCLASSEX,前者本來用于 Windows 早期版本,但現在仍可沿用;后者用于 32 位 Windows,該結構包含 1 個 cbSize 成員和 1 個指向小圖標的句柄,其 它兩者相同。
WNDCLASSEX 定義如下:
```
typedef struct_WNDCLASSEX
{
UINT cbSize;
UINT style;
WNDPROC lpfn WndProc;
int cbClsExtra;
int cbWndExtra;
HANDLE hInstance;
HICON hIcon;
HCURSOR hCursor;
HBRUSH hbrBackground;
LPCTSTR lpszMenuName;
LPCTSTR lpszClassName;
HICON hIconSm;
}WNDCLASSEX;
ATOM RegisterClassEx
(
CONST WNDCLASSEX *lpwcx
);
```
調用過程如下:
```
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW; //窗口風格
wcex.lpfnWndproc = (WNDPROC)WndProc; //窗口過程,處理消息響應
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance; //程序實例
wcex.hIcon = 0; //圖標
wcex.hCursor = LoadCursor(NULL,IDC_ARROW); //光標
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); //背景色
wcex.lpszMenuName = NULL; //菜單資源
wcex.lpszClassName = “Your Class Name”; //窗口類名
wcex.hIconSm = NULL; //小圖標
RegisterClassEx(&wcex); //注冊窗口類
```
在此之后,就可以使用函數 CreateWindow 創建窗口了。不過,這個函數還有 11 個參數,第 1 個 參數就是:
```
wcex.lpszClassName = “Your Class Name”;
```
只有用注冊過的窗口類名才可以創建窗體。不過,用戶一般情況下不用擔心這些事情,因為,MFC 已經做了其中的大部分事情。如:
(1) 在 3 個應用程序框架里,主要的窗口都已經被創建了,可以直接使用 C++對象;
(2) 在資源編輯器里,控件窗口也被設計好了,您可以用 Class Wizard 為控件窗口連 接 C++對象。
(3) 如果是動態創建控件,您只需要用 Create 等函數來創建窗口,這一過程中,MFC 提 供了方法來判斷窗口類是否注冊。若未注冊,則先注冊,再創建窗口(您完全可以不了解這 些內容)。
### 3.2.3 Windows 編程基礎
1\.環境變量
和類 Unix 系統一樣,Windows 系統也有環境變量,分為系統環境變量和用戶環境變量 兩種。
一般來說,系統環境變量影響所有的用戶和程序,但更改系統環境變量后,對已經啟 動的服務程序并不起作用,因為此服務程序并不知道環境變量已發生改變,需要重新啟動操 作系統。
在命令提示符下,運行 set 可以看到當前所有的環境變量。同時, set 也可以更改環境 變量的值,但僅對當前的命令提示符下啟動的程序起作用。
Windows 也提供 GUI 工具來修改環境變量,做法是單擊【開始】菜單, 或者在【我的電 腦】圖標上單擊鼠標右鍵,在彈出的菜單中選擇【屬性】命令,彈出【系統屬性】對話框。 切換到【高級】選項頁,單擊下方的【環境變量】按鈕,彈出【環境變量】對話框,可以查 看或修改增加環境變量,此時的界面如圖 3-2 所示。

圖 3-2 環境變量的查看設置對話框
環境變量 PATH 的功能和 Unix 下的 PATH 加上 LD_LIBRARY_PATH 是一樣的,同時影響可 執行文件和動態鏈接庫。執行命令時, Windows 會根據是否含路徑,是否是 cmd 內部命令, 當前路徑下是否有可執行擴展名的文件,然后再在 PATH 環境變量(先系統的再到用戶的) 路徑里查找有無可執行擴展名的文件。如果匹配,則執行。對于動態鏈接庫,則是查找是否 包含路徑,系統的 system32(32 位 OS 情況下)路徑,然后是 PATH 環境變量(先系統的再 到用戶的)路徑里查找動態鏈接庫的文件。
其他需要傳遞的信息對 C/C++程序員影響比較小,因為傳遞信息的方式已經被存取注冊 表這種方式取代。
2\.注冊表
注冊表可以看作是一個系統的數據庫,大量系統及用戶的數據在此存放,尤其是配置數據及運行狀態數據。這些數據有字符、數字及二進制數組等類型。通過以 Reg 開頭的一系列函數,可以存取注冊表數據。
需要注意的是,注冊表中的數據是透明的,其他程序及 regedit、regedt32 等系統工 具,也可以存取這些數據,這些數據 并不是被某個用戶所獨占的。
3\.開機自動運行程序
通常我們開發的許多處理程序,往往是無人職守的開機自動運行的。
有許多種方式,可以讓程序開機自動運行。通常可以在啟動組里面,建立要運行程序的快捷方式。另外,可以放到全局或用戶的啟動注冊表里面。全局的注冊表項位于 “我的 電腦\HEKY_LOCAL_MACHINE\software\microsoft\Windows\currentversion\run”里面,用戶注冊表項在“我的電腦\HKEY_CURRENT_USER\software\microsoft\Windows\currentversion\run”里面。圖 3-3 是用 regedit.exe 程序打開的注冊表里面的全局啟動程序數據。可以用工具或注冊表的 API函數修改數據。

圖 3-3 注冊表中的全局自動運行程序數據
上述方法,有一個前提,就是用戶必須能夠自動登錄系統。這可以通過修改注冊表來 解決,方法是在注冊表項 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\Winlogon 下面,增 加 DefaultUserName、DefaultPassword、AutoAdminLogon 三項數據,分別填入用戶名和 密碼,及數字 1,其中,DefaultUserName, DefaultPassword 的類型是字符串, AutoAdminLogon 的類型是數字。這樣做雖然可以實現目標,但是存在安全隱患,就是你的 用戶密碼以明文保存在注冊表里面,這通常是非常危險的。
還可以采用其他方法來規避安全隱患。采用任務計劃是一種方法,把計劃的屬性設為 在系統啟動時啟動,把計劃的命令設置為要自動啟動的程序。
其實最理想的方法是,把程序寫成服務程序,設定此程序為服務,啟動方式設為自動 啟動。當然也可以使用 sc 命令,把普通的程序設為服務并設置為自動啟動。
需要注意的是,如果自動運行的程序導致了系統錯誤,則很難進行跟蹤調試,定位故障。
4\.服務程序
服務程序是一種特殊機制的程序,用戶不能直接運行或停止服務程序的可執行文件, 而是通過控制服務的啟動停止來啟動和退出。這些程序啟動可以不需要用戶登錄就自動運 行,可以不需要 GUI 界面,非常適合業務處理類型程序的運行方式。
在控制面板里的服務管理面板中可以查看、啟動和停止服務程序。
在 DOS 命令提示符環境下,可以用 net start 命令查看啟動的服務列表;用“net start 服務名”命令啟動服務;用“net stop 服務名”停止服務。
命令 sc 可以用來增加、刪除、設置、啟動或停止服務。
5\.使用 Visual C++
Windows 編程是很復雜的事情。我們使用微軟提供的 Develop Studio 中的 Visual C++ IDE,它能夠處理編譯和連接,提供幫助參考,自動生成程序框架代碼,并且提供一種可視 化的設計環境。
在開始使用 Visual Studio 之前,需要掌握一些相應的知識和技能。最為重要的是要 熟練掌握在線幫助-MSDN 的使用方法。
然后是最重要的組合鍵 Ctrl+W。這個組合鍵能夠調出 Class Wizard。Class Wizard 能 夠為程序員在項目中加入代碼,能夠處理連接函數與 Windows 發送的消息的代碼。
我們也會經常用到 Resource 視圖面板。它可以用于設計 GUI。可以在對話框或其他框 架上放置窗口部件。通常情況下,通過若干次鼠標的點擊,就可以完成界面的布局。然后再 使用 Class Wizard,完成類和對象的添加。剩下的工作主要是完成 Class Wizard 生成的函 數,并處理消息等。
這里不準備詳細討論 Visual C++的用法,并且從 VC6.0 到現在的 VC2008,每個版本都 擁有大量的使用者,而它們的操作方式也 不盡相同,請讀者朋友在使用時閱讀相關的書籍并 用心體會。
6\.使用 MSDN
筆者最初學用 Visual C++時,經常會因為不知道某些類和方法如何使用而去問別人。 有一次,因為要問一個問題,把一位老鳥請到我的機器上,那位同事順手就在我的計算機上 找 MSDN,找了半天沒有找到,經詢問我得知并沒有安裝時,他非常驚訝的說:沒有裝 MSDN 怎么搞開發啊?
這是真實的故事,從中我們可以看出 MSDN 在 Windows 平臺的軟件開發的重要地位,但 需要澄清的一個錯誤觀念是 MSDN 并不是專門與 Visual C++配套使用的,它的內容涵蓋了在 Windows 上開發所需的方方面面的內容。所以可以這樣說,只要是在 Windows 上進行應用開 發,就需要使用 MSDN。下面我們就來了解和學用一下 MSDN。
(1) MSDN 簡介
MSDN 是 Microsoft Software Developer Network 的簡稱,是微軟針對開發者的幫助網絡,可以在 http://msdn.microsoft.com 看到有關的詳細介紹。MSDN 可以單獨購買訂閱,也可以在購買 Visual Studio 套件時得到。
(2) MSDN 的使用。MSDN 的安裝比較簡單,只需要按照向導提示安裝即可完成。安裝完 畢后,可以在 Windows 的開始菜單里找到【Microsoft Developer Network】→【MSDN Library for Visual Studio 2005】這一項(因為筆者安裝的是這個版本,你的可能會有所 不同),通過這個菜單就可以打開 MSDN 了,也可以在 Visual Studio 中按下 F1 鍵打開 MSDN。打開后的 MSDN 主界面如圖 3-4 所示。

圖 3-4 MSDN 主界面
MSDN 菜單操作方式和一般的 Windows 幫助文件的樣式并無不同。
- 第 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 開發社區