Qt

**Qt**（/ˈkjuːt/，發音同「cute」）是一個跨平台的 C++ 應用程式開發框架。廣泛用於開發 GUI 程式，這種情況下又被稱為部件工具箱。也可用於開發非 GUI 程式，例如控制台工具和伺服器。Qt 被用於 OPIE、Skype、VLC media player、Adobe Photoshop Elements、VirtualBox 與 Mathematica 以及被 Autodesk 、歐洲太空總署、夢工廠、Google、HP、KDE、盧卡斯影業、西門子公司、沃爾沃集團，華特迪士尼動畫製作公司、三星集團、飛利浦、Panasonic 所使用。

它是 Digia 公司的產品。Qt 使用標準的 C++ 和特殊的代碼生成擴充（稱為元物件編譯器（Meta Object Compiler, moc））以及一些巨集。通過語言綁定，其他的程式語言也可以使用 Qt。

Qt 是自由且開放原始碼的軟體，在 GNU 較寬鬆公共許可證（LGPL）條款下發布。所有版本都支援廣泛的編譯器，包括 GCC 的 C++ 編譯器和 Visual Studio。

## 歷史

Haavard Nord 和 Eirik Chambe-Eng 於 1991 年開始開發「Qt」，1994 年 3 月 4 日創立公司，最早名為 Quasar Technologies，然後更名為 Troll Tech，之後又再次更名為 Trolltech，中文名是「奇趣科技」，2008 年 6 月 17 日被 NOKIA 公司收購，以增強該公司在跨平台軟體研發方面的實力，更名 Qt Software。

該工具包名為 Qt 是因為字母 Q 在 Haavard 的 Emacs 字體特別漂亮，而「t」代表「toolkit」，靈感來自 Xt，X toolkit。

2009 年 5 月 11 日，諾基亞 Qt Software 宣布 Qt 原始碼管理系統面向公眾開放，Qt 開發人員可通過為 Qt 以及與 Qt 相關的專案貢獻代碼、翻譯、範例以及其他內容，協助引導和塑造 Qt 未來的發展。為了便於這些內容的管理，Qt Software 啟用了基於 Git 和 Gitorious 開源專案的 Web 原始碼管理系統。

在推出開放式 Qt 代碼函式庫的同時，Qt Software 在其網站釋出了其產品規劃（Roadmap）。其中概述了研發專案中的最新功能，展現了現階段對 Qt 未來發展方向的觀點，以期鼓勵社群提供回饋和貢獻代碼，共同引導和塑造 Qt 的未來。2012 年 8 月 9 日，Digia 宣布已完成對諾基亞 Qt 業務及軟體技術的全面收購，並計劃將 Qt 應用到 Android、iOS 及 Windows 8 平台上。

## 支援平台

使用 Qt 開發的軟體，相同的程式碼可以在任何支援的平台上編譯與執行，而不需要修改原始碼。會自動依平台的不同，表現平台特有的圖形介面風格。

* **Linux/X11**：用於 X Window System（如 Solaris、AIX、HP-UX、Linux、BSD）。支援 KDevelop 和 Eclipse IDE 整合
* **Mac**：用於 Apple Mac OS X。基於 Cocoa 框架。支援 Universal Binary。支援以 Xcode 編輯、編譯和測試。
* **Windows**：用於 Microsoft Windows。支援 Visual Studio 整合，也可以使用 MinGW 編譯
* **Embedded Linux**：用於嵌入式 Linux。可以透過編譯移除不常使用的組件與功能。透過自己的視窗系統 QWS，不需依賴 X Window System，直接寫入 Linux 影格緩衝。可以減少記憶體消耗。並提供虛擬影格緩衝 QVFb，方便在桌面系統上進行嵌入式測試。
* **Windows CE / Mobile** ：用於 Windows CE
* **Symbian**：用於 Symbian platform
* **Maemo/MeeGo**：用於 Maemo
* **Wayland** –用於 Wayland 顯示伺服器，Qt 應用程式可以在運行時切換圖形後端，如 X 與 Wayland。

### 外部移植

自從諾基亞開放了 Qt 的原始碼給社群後，Gitorious 上各種移植紛紛出現。下面是其中一部份：

* **Qt for OpenSolaris** –用於 OpenSolaris
* **Qt for Haiku** –用於 Haiku OS
* **Qt for OS/2** –仍然不完整的 OS/2 eCS platform 移植。
* **Qt-iPhone** –用於 iPhone 的實驗中產品。
* **Android-Lighthouse** –用於 Android 的實驗中產品。
* **Qt for webOS** –用於 Palm Pre 上 webOS 的實驗中產品。
* **Qt for Amazon Kindle DX** –用於 Amazon Kindle DX 的實驗中產品。

## 授權模式

Qt 開放原始碼，並且提供自由軟體的使用者協定。使得它可以被廣泛地應用在各平台上的開放原始碼軟體開發中。

Qt 提供三種授權方式。三種授權方式的功能、效能都沒有區別，僅在於授權協定的不同。LGPL 和 GPL 是免費釋出，商業版則需收取授權費。：

* Qt 商業版 - Qt 商業授權適用於開發專屬和 / 或商業軟體。此版本適用於不希望與他人共享原始碼，或者遵循 GNU 較寬鬆公共許可證（LGPL）2.1 版或 GNU GPL 3.0 版條款的開發人員。提供了技術支援服務。可以任意的修改 Qt 的原始碼，而不需要公開。
* GNU LGPL v. 2.1- Qt 4.5.0 及以後的版本開始遵循 GNU LGPL。LGPL 允許鏈結到它的軟體使用任意的授權條款，可以被專屬軟體作為類別館參照、釋出和銷售。可以購買支援服務。
* GNU GPL v. 3.0 - 如果您希望將 Qt 應用程式與受 GNU 通用公眾授權條款（GPL）3.0 版本條款限制的軟體一同使用，或者您希望 Qt 應用程式遵循該 GNU 授權條款版本的條款，則此版本 Qt 適用於開發此類 Qt 應用程式。可以購買支援服務。

## Qt 模組

經過多年發展，Qt 不但擁有了完善的 C++ 圖形函式庫，而且近年來的版本逐漸整合了資料庫、OpenGL 函式庫、多媒體函式庫、網路、指令碼函式庫、XML 函式庫、WebKit 函式庫等等，其核心函式庫也加入了行程間通訊、多執行緒等模組，極大的豐富了 Qt 開發大規模複雜跨平台應用程式的能力，真正意義上實現了其研發宗旨「Code Less; Create More; Deploy Anywhere」。

由於各家編譯器規格不同，Qt 本身為了跨平台相容性，只能以「最低相容規格」來設計。因此 Qt 必須具備 RTTI、動態建立、Persistence/Serialization 的基礎建設，以及建構出自己的容器元件。

* 下列模組提供一般的軟體開發
  * QtCore—QtCore 模組是所有基於 Qt 的應用程式的基礎，提供訊號與槽的物件間通訊機制、IO、事件和物件處理、多執行緒
  * QtGui— 包含了開發圖形使用者介面應用程式所需的功能。使用其支援的各個平台的原生圖形 API。支援反鋸齒、向量形變。支援 ARGB 頂層 widget
  * QtMultimedia— 提供了用於多媒體內容處理的 QML 類型集和 C++ 類集。同時提供存取攝像頭及音訊功能的 API。包含的 Qt 音訊引擎支援三維音訊回放及管理。
  * QtNetwork— 提供了網路程式設計功能。支援通用協定，如 HTTP、FTP 和 DNS，包括對非同步 HTTP 1.1 的支援。與較低層的 TCP/IP 和 UDP 協定，如 QTcpSocket、QTcpServer 和 QUdpSocket
  * QtOpenGL— 提供在應用程式中使用 OpenGL 和 OpenGL ES 加入 3D 圖形。在 Windows 平台上亦支援 Direct3D
  * QtOpenVG - 提供 OpenVG 繪圖支援的一個外掛程式
  * QtScript— 包含完全整合的 ECMA 標準指令碼引擎。提供訊號與槽機制簡化物件間通訊和 QtScript 偵錯程式。
  * QtScriptTools— 額外的 Qt Script 組件
  * QtSql— 將資料庫整合至應用程式。支援所有主要的資料庫驅動包括 ODBC、MySQL、PSQL、SQLite、ibase、Oracle、Sybase、DB2。
  * QtSvg— 支援 SVG 格式
  * QtWebKit— 整合 WebKit，提供了 HTML 瀏覽器引擎，便於在原生應用程式中嵌入網路內容和服務。
  * QtXml— 提供了 XML 文件的閱讀器和編寫器、支援 SAX 和 DOM。
  * QtXmlPatternsl— 提供了 XQuery 和 XPath 引擎支援。
  * Phonon— 整合 Phonon，支援跨平台應用程式播放音訊和視訊內容。Qt5 開始不支援 Phonon。
  * Qt3Support— 模組提供相容 Qt 3.х.х版本的程式庫
  * QtDeclarative - engine for declaratively building fluid user interfaces in QML
* 作業於 Qt 附帶工具的模組
  * QtDesigner— 提供擴充 Qt Designer 的類別。
  * QtUiTools
  * QtHelp— 協助整合線上檔案到應用程式中。
  * QtTest— 提供單元測試框架和滑鼠和鍵盤類比功能。整合 Visual Studio 和 KDevelop。
* 下列模組用於 Unix 開發
  * QtDBus
* 下列模組用於 Windows 開發
  * QAxContainer
  * QAxServer

### 圖形使用者介面

Qt 的圖形使用者介面的基礎是 QWidget。Qt 中所有類型的 GUI 組件如按鈕、標籤、工具列等都衍生自 QWidget，而 QWidget 本身則為 QObject 的子類別。Widget 負責接收滑鼠，鍵盤和來自窗口系統的其他事件，並描繪了自身顯示在螢幕上。每一個 GUI 組件都是一個 widget，widget 還可以作為容器，在其內包含其他 Widget。

QWidget 不是一個抽象類別。並且可以被放置在一個已存在的使用者介面中；若是 Widget 沒有指定父 Widget，當它顯示時就是一個獨立的視窗、或是一個頂層 widget。QWidget 顯示能力包含了透明化及 Double-Buffering。Qt 提供一種代管機制，當 Widget 於建立時指定父物件，就可把自己的生命週期交給上層物件管理，當上層物件被釋放時，自己也被釋放。確保物件不再使用時都會被刪除。

### 訊號與槽

Qt 利用訊號與槽（signals/slots）機製取代傳統的 callback 來進行物件之間的溝通。當操作事件發生的時候，物件會發送出一個訊號（signal）；而槽（slot）則是一個函式接受特定訊號並且執行槽本身設定的動作。訊號與槽之間，則透過 QObject 的靜態方法 connect 來連結。

訊號在任何執行點上皆可發射，甚至可以在槽裡再發射另一個訊號，訊號與槽的連結不限定為一對一的連結，一個訊號可以連結到多個槽或多個訊號連結到同一個槽，甚至訊號也可連接到訊號。

以往的 callback 缺乏類型安全，在呼叫處理函式時，無法確定是傳遞正確型態的參數。但訊號和其接受的槽之間傳遞的資料型態必須要相符合，否則編譯器會提出警告。訊號和槽可接受任何數量、任何型態的參數，所以訊號與槽機制是完全類型安全。

訊號與槽機制也確保了低耦合性，發送訊號的類別並不知道是哪個槽會接受，也就是說一個訊號可以呼叫所有可用的槽。此機制會確保當在 "連接" 訊號和槽時，槽會接受訊號的參數並且正確執行。

### 布局管理

布局管理類別用於描述一個應用程式的使用者介面中的 Widget 是如何放置。當視窗縮放時，布局管理器會自動調整 widget 的大小、位置或是字型大小，確保他們相對的排列和使用者介面整體仍然保有可用性。

Qt 內建的布局管理類型有：QHBoxLayout、QVBoxLayout、QGridLayout 和 QFormLayout。這些類別繼承自 QLayout，但 QLayout 非繼承自 QWidget 而是直接源於 QObject。他們負責 widget 的幾何管理。想要建立更複雜的版面組態，可以繼承 QLayout 來自訂版面組態管理員。

* QHBoxLayout：組態 widget 成橫向一列
* QVBoxLayout：組態 widget 成垂直一行
* QGridLayout：組態 widget 在平面網格
* QFormLayout：組態 widget 用於 2 欄標籤 - field

### Main Window

Qt 提供了下列主視窗管理和相關的使用者介面組件的類別：

* QMainWindow：提供一個標準的應用程式主視窗。當中可以包括選單、工具列、狀態列、停駐元件等元件。
* QDockWidget：提供了一個可用於建立彈簧工具調色板或輔助窗口的 widget。Dock widgets 可以移、關閉、浮動為外部視窗。
* QToolBar：提供了一個通用的工具欄 widget，可以放入一些不同的 action 有關的工具，如按鈕、下拉選單、comboboxes 和 spin boxes。

### Graphics View

Graphics View 提供了用於管理和互動大量客製化的 2D 圖形物件的平面以及視覺化顯示物件的視圖 widget，並支援縮放和旋轉功能。

整個 Graphics View 框架提供一個以 Item 為基礎的 model-view 設計。由 3 個主要的類別組成，分別是 QGrphicsItem、QGraphicsScene 和 QGraphicsView。若干 View 可以顯示一個 Scene，Scene 中則包含不同幾何形狀的 Item。

該框架包括一個事件傳播的架構，讓在 Scene 上的 Item 有雙精度的互動能力。Item 可以處理鍵盤事件，鼠標按下、移動、釋放和雙擊事件，他們也可以跟蹤鼠標移動。

Graphics View 使用 BSP（二進位空間劃分）樹可非常快速地找到 Item，因此即使是包含百萬個 Item 的大型 Scene，也能即時圖形化顯示。

KDE 中的 Plasma 亦是基於 Graphics View 實現的。

### 無障礙環境

無障礙環境需要無障礙相容的應用程式、輔助技術、以及輔助工具之間的合作。應用程式通常不會直接溝通輔助工具，而是通過一個輔助技術，這是一個應用程式和工具之間資訊交流的橋梁。使用者介面元素相關訊息，例如按鈕和滾動條，使用輔助技術來顯示。Qt 支援 Windows 上的 Microsoft Active Accessibility（MSAA）和 Mac OS X 上 Mac OS X Accessibility。

無障礙相容的應用程式稱為 AT-Servers，而輔助工具被稱為 AT-Clients。Qt 應用程式通常會是一個 AT-Server，但特別的程式也可能如同 AT-Client 方式工作。

### 國際化

Qt 的字體引擎能夠在同一時間正確的顯示各種不同的書寫系統。並且 Qt 內部使用 Unicode 編碼來儲存文字。

Qt 的多國語言支援技術，可以讓應用程式中的文字全部使用英文撰寫，能夠在完全不需修改程式的狀況下，改變整個應用程式中的文字為另一個語系的文字，並能夠協助處理不同語言的單、複數問題。

獨立的翻譯檔案使得新增支援語言相當容易，同時翻譯檔案（.ts）為 XML 格式可以直接編輯或使用 Qt Liguist 進行翻譯，可讓無程式開發能力的翻譯者亦能獨自完成翻譯。Qt 附帶的工具程式就能夠自動抽取需要翻譯的文字產生翻譯檔案。

### 多執行緒

Qt 的執行緒支援是獨立於平台的執行緒類別，採用訊號與槽機制，實現類型安全的執行緒間通訊。這使得它易於開發具可移植性的多執行緒 Qt 應用程式。並能充分利用多核架構，獲得最佳執行效能，還能根據可用的處理器核心數自動調整使用的執行緒數。多執行緒程式設計也是一個執行耗時操作而不會凍結使用者介面的有效典範。

### 語言綁定

除了 C++ 外，Qt 還為其它多種電腦語言提供了應用程式介面，您也可以使用這些語言開發 Qt 應用程式。

## 工具

Qt 提供了一些命令列和圖形工具，以方便和加速開發的過程。

* Qt Creator：輕量級的 Qt/C++ IDE 開發環境。
* qmake：跨平台構建工具，可簡化跨不同平台進行專案開發的構建過程。
* Qt Designer：介面設計師。可以用拖拽的方式將 Widget 排放在介面上，支援版面組態，支援訊號與槽編輯。
* Qt Assistant：Qt 助手。Qt 在線幫助檔案檢視工具。
* Qt Liguist：翻譯工具。讀取翻譯檔案（如.ts、.po）並為翻譯人員提供友好的翻譯介面。
* lupdate：從原始碼檔案或其他資源檔案中提取需要翻譯的字串，並將之存入 xml 格式的.ts 檔案中。
* lrelease：負責將.ts 檔案轉化為程式使用的.qm 檔案。.qm 檔會去掉.ts 檔中所有的空白和未翻譯的內容，並將儲存格式壓縮。
* lconvert：用於翻譯檔案之間的格式轉換。
* QVFb：虛擬影格快取裝置，類比 framebuffer 裝置（尺寸、色深），還可以透過 skin 類比硬體鍵盤的布局（包括特殊的按鍵），可以便捷在桌面系統機器上開發嵌入式程式
* makeqpf：建立用於嵌入式裝置的 qpf 格式。qpf 是一種預先彩現的字體，直接儲存成二進位內容，使用的時候可以用記憶體對映載入，從載入到繪製的過程不需要計算。
* uic：User Interface Compiler。從使用者介面的檔案（.ui）生成 C++ 代碼。
* rcc：Resource Compiler。rcc 工具根據.qrc 檔案的內容將相關的資源在編譯過程中嵌入到 Qt 應用程式。
* qtconfig：基於 X11 的 Qt 的組態工具和在線幫助。
* qconfig：Qt Embedded（Linux 和 Windows CE）組態工具。
* qtdemo：Qt 的實例和示範項目的載入器。
* qt3to4：協助移植 Qt 3 程式到 Qt 4 的工具。
* qdbusxml2cpp：QtDBus XML compiler。將 xml 格式的 D-Bus 介面描述轉換成為 C++ 原始碼
* D-Bus Viewer：可以檢視 D-Bus 物件和資訊的工具。
* Qt Visual Studio Add-in：Visual Studio 整合
* Qt Eclipse Integration：Eclipse 整合

## Qt Solutions

Qt Solutions 提供 Qt 額外的組件和工具，使 Qt 的開發更有效率。在 Qt 4.5 之後，Qt Solutions 加入了 LGPL 的授權

* 平台和特定行業的組件和工具
* 整合 Qt 與特定第三方產品的組件和工具
* 尖端的元件和新的工具也會被直接加入在 Qt 框架中發布

## 使用

### 使用 Qt 的 UI 環境

* KDE Plasma Workspaces：著名的跨平台圖形化環境。
* MeeGo：基於 Linux 的開源手機作業系統
* Motorola A760：UI 以 Qt/Embedded 建構
* OPIE
* Qt Extended Improved
* Razor-qt：桌面環境
* Symbian 自第四版開始

### 視窗管理員

以下的視窗管理員，使用了 Qt：

* EggWM
* integrity
* KWin
* qlwm
* deepin-wm

### 應用程式

一些出名的例子如下：

* 3DSlicer, a free open source software for visualization and medical image computing
* AcetoneISO：映像檔掛載軟體
* Adobe Photoshop Album, an image organizing application
* Arora：一款跨平台的開源網頁瀏覽器
* Autodesk MotionBuilder：專業的 3D 角色動畫軟體
* Autodesk Maya, 3D 建模和動畫軟體
* Autodesk 3ds Max
* Avidemux, a Free Software program designed for multi-purpose video editing and processing
* Avogadro：進階分子編輯器
* BOUML，a free uml toolbox
* chmcreator：開源的 chm 開發工具
* CineFX：一款跨平台、開源、免費、影片剪輯，特效與合成套裝
* CoCoA, a software for computations in commutative algebra
* Dash Express, an Internet-enabled personal navigation device
* DAZ Studio, a 3D figure illustration/animation application
* Doxygen：API 檔案產生器
* EAGLE, tool for designing printed circuit boards (PCBs)
* EiskaltDC++, a program that uses the Direct Connect protocol.
* Emergent：神經網路模擬器。
* FEKO, a software product for the simulation of electromagnetic fields
* eva：Linux 版 QQ 聊天軟體。
* FreeCAD, a free and open source 3D-Solid and general purpose design CAD/CAE
* FreeMat：一個自由開源的數值計算環境和程式語言
* Full Tilt Poker, one of the most popular online poker programs
* Gadu-Gadu：即時通訊軟體
* Gambas, A free development environment based on a Basic interpreter
* GoldenDict：一款開源的字典軟體
* Google 地球（Google Earth）：三維虛擬地圖軟體。
* GNS：Cisco 網路模擬器。
* Guitar Pro 6, a tablature editor
* 刺蝟大作戰：一個基於百戰天蟲的開源遊戲。
* Hydrogen, an advanced drum machine
* ImageVis3D, a volume ray-casting application
* Ipe：自由的向量圖形編輯器
* ISE Webpack, a freeware EDA tool for Windows and Linux developed by Xilinx
* Kadu, a Polish instant messenger using the Gadu-Gadu protocol
* KDELibs：一個許多 KDE 程式都使用的共享庫，如 Amarok、K3b、KDevelop、KOffice 等。
* KeePassX, a multi-platform port of KeePass, an open source password manager for Microsoft Windows
* Last.fm 播放器：著名的網際網路音樂社群網站的桌面使用者端。
* Launchy：一個開放原始碼的快捷啟動器
* LMMS：一個開放原始碼的音樂編輯軟體
* LyX：使用 Qt 作為介面的 LaTeX 軟體。
* Mathematica：Linux 和 Windows 版本使用 Qt 作為 GUI
* Maxwell Render, a software package that aids in the production of photorealistic images from computer 3D model data
* Mixxx：跨平台的開放原始碼 DJ 混音軟體
* MuseScore，一個 WYSIWYG 的樂譜編輯器
* MythTV：開源的數位視訊錄製軟體。
* Nuke, a node-based compositor
* PDFedit：自由的 PDF 編輯器
* PokerTH, an open source Texas hold 'em simulator
* Psi：一款 XMPP 網路協定的即時通訊軟體
* qBittorrent：自由的 BitTorrent P2P 客戶端
* QCad：一個用於二維設計及繪圖的 CAD 軟體
* Qjackctl, a tool for controlling the JACK Audio Connection Kit
* QSvn, a GUI Subversion client for Linux, UNIX, Mac OS X and Windows
* Opera：著名的網頁瀏覽器。
* Qt Creator, the free software cross-platform integrated development environment from Nokia
* Qterm：跨平台的 BBS 軟體。
* Quantum GIS：自由的桌面 GIS
* Quassel IRC：跨平台的 IRC 客戶端
* QupZilla：跨平台的開放原始碼的 Webkit 網頁瀏覽器。
* RealFlow, a fluid and dynamics simulator for the 3D industry
* Recoll：桌面搜尋工具
* Rosegarden, a free software digital audio workstation program
* SciDAVis, a cross-platform plotting and data analysis program
* Scribus：桌面排版軟體。
* Skype：一個使用人數眾多的基於 P2P 的 VOIP 聊天軟體。
* SMPlayer：跨平台多媒體播放器
* Spotify, music streaming service.
* Stellarium：一款天文學的自由軟體
* TeamSpeak：跨平台的音效通訊軟體
* Texmaker：一款跨平台的開放原始碼 LaTeX 編輯器
* TeXworks, It is a graphical user interface to the typesetting system TeX.
* Tlen.pl：波蘭人發明的即時通訊客戶端
* TOra, a database administration tool
* UMPlayer: 基於 Mplayer 的美觀多媒體播放器。
* UniversalIndentGUI，an application which helps the user to beautify, reformat or indent various kinds of code.
* Valknut, a program that uses the Direct Connect protocol
* VirtualBox：虛擬機器軟體。
* VisIt：一個開源型互動式並列可視化與圖形分析工具，用於檢視科學數據。
* VisTrails, a scientific workflow management and visualization system
* VLC 多媒體播放器：一個體積小巧、功能強大的開源媒體播放器。
* VoxOx, a unified communications software.
* WordPress, based on Qt for Maemo and Symbian
* wpa supplicant, a free software implementation of an IEEE 802.11i
* Xconfig：Linux 的 Kernel 組態工具
* YY 語音：又名「歪歪語音」，是一個可以進行線上多人語音聊天和語音會議的免費軟體。在中國大陸擁有龐大的使用者群。
* 咪咕音樂：中國移動打造的正版音樂播放器
* WPS Office：金山公司（Kingsoft）出品的辦公軟體，與微軟 Office 相容性良好，個人版免費。

## 參見

* Qt Development Frameworks
* Qt Quick
* QML
* Advanced Component Framework

## 書目

## 參考文獻

## 外部連結

* 官方網站
  * 中文官方網站（頁面存檔備份，存於網際網路檔案館）