## 13.6 構建 Qt 應用程序
利用一套工具,Qt 開發人員可以簡化在所有支持平臺中構建應用程序的流程。描述應 用程序、庫和插件的項目文件被用來為每個平臺生成適當的 makefile。
.pro 文件描述了各個項目,該文件以文本方式概述了源文件、頭文件、 Qt Designer 窗體以及其他資源。這些資源都是由 qmake 工具來處理的,以便為每個平臺中的項目生成 適當的 Makefile。
項目文件可描述 Qt 的所有庫、工具以及示例。例如,只需以下三行即可描述 Qt 4 的 HTTP 示例:
```
HEADERS += httpwindow.h
SOURCES += httpwindow.cpp main.cpp
QT += network
```
前兩個定義將構建此示例所需的頭文件和源文件告知 qmake; 而最后一個定義則確保 使用 Qt 的網絡連接庫。使用項目文件語法,開發人員可以使用配置選項對編譯流程進行精 細調節,并可為不同的部署環境編寫各種有條件的編譯規則。
此外,使用項目文件可以描述處于目錄樹層次較深位置的項目。 例如,Qt 示例位于頂 級 examples 目錄內的目錄樹中。examples.pro 文件要求 qmake 深入到含有下列行的各類 示例的目錄中:
```
TEMPLATE = subdirs
SUBDIRS = dialogs draganddrop itemviews layouts linguist \
mainwindows network painting richtext sql \
threads tools tutorial widgets xml
```
支持條件編譯意味著 Windows 示例程序只有在 windows 操作系統下的 Qt windows 版 本時才會被編譯。
```
win32:!contains(QT_EDITION, OpenSource|Console):SUBDIRS += activeqt
```
使用 qmake 編譯項目時,編譯套件中的其他工具自動會提供 Qt 的所有增強功能:moc將處理頭文件以啟用信號和槽;rcc 將編譯指定的資源; 而 uic 則可用來根據用戶界面創建代碼。
pkg-config 集成支持預編譯頭文件,可以生成 Visual Studio 項目文件;以及其他高 級功能,可以支持開發人員在針對常見項目組件使用跨平臺構建系統的同時,還支持其利用 與平臺特定相關的工具。
更為深入的信息,請參考本書的附錄,那里有 qmake 以及 make 命令的詳細介紹。 13.7 問題與解答
問:什么情況下可以斷開信號與槽的關聯? 答:有 3 種情況需要斷開信號與槽的關聯: 1.斷開與某個對象相關聯的任何對象
這似乎有點不可理解,事實上,當我們在某個對象中定義了一個或者多個信號,這些 信號與另外若干個對象中的槽相關聯,如果我們要切斷這些關聯的話,就可以利用這個方 法,非常之簡潔。
```
disconnect( myObject, 0, 0, 0 );
```
或者
```
myObject->disconnect();
```
2\.斷開與某個特定信號的任何關聯
```
disconnect( myObject, SIGNAL(mySignal()), 0, 0 )
```
或者
```
myObject->disconnect( SIGNAL(mySignal()) )
```
3\.斷開兩個對象之間的關聯。
```
disconnect( myObject, 0, myReceiver, 0 )
```
或者
```
myObject->disconnect( myReceiver )
```
在 disconnect 函數中 0 可以用作一個通配符,分別表示任何信號、任何接收對象、接 收對象中的任何槽函數。但是發射者 sender 不能為 0,其它三個參數的值可以等于 0。
問:Qt 的元對象系統還有哪些功能?
答: 除了提供在對象間進行通訊的機制外,元對象系統還包含以下幾種功能:
1\.QObject::metaObject() 方法
它獲得與一個類相關聯的 meta-object。
2\.QMetaObject::className() 方法
在運行期間返回一個對象的類名,它不需要本地 C++編譯器的 RTTI(run-time type information)支持。
3\.QObject::inherits() 方法
它用來判斷生成一個對象類是不是從一個特定的類繼承出來,當然,這必須是在 QObject 類的直接或者間接派生類當中。
4\.QObject::tr() and QObject::trUtf8()
這兩個方法為軟件的國際化翻譯字符串 。
5\.QObject::setProperty() and QObject::property()
這兩個方法根據屬性名動態的設置和獲取屬性值 。
除了以上這些功能外,它還使用 qobject_cast()方法在 QObject 類之間提供動態轉 換,qobject_cast()方法的功能類似于標準 C++的 dynamic_cast(),但是 qobject_cast() 不需要 RTTI 的支持,在一個 QObject 類或者它的派生類中,我們可以不定義 Q_OBJECT 宏。如果我們在一個類中沒有定義 Q_OBJECT 宏,那么在這里所提到的相應的功能在這個類 中也不能使用,從 meta-object 的觀點來說,一個沒有定義 Q_OBJECT 宏的類與它最接近的 那個祖先類是相同的,那就是說, QMetaObject::className() 方法所返回的名字并不是這 個類的名字,而是與它最接近的那個祖先類的名字。 所以,我們強烈建議,任何從 QObject 繼承出來的類都定義 Q_OBJECT 宏。
問:在 Qt 中怎么響應事件,比如鼠標點擊事件,鍵盤敲擊事件等。
答:你需要在程序中重載下列函數,具體可以查閱 Qt Assistant。
```
mousePressEvent(QMouseEvent *event)
{
//要做的事
}
keyPressEvent(QkeyEvent *event)
{
//要做的事(鍵盤)
}
```
- 第 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 開發社區