Qt

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

Qt 使用標準的 C++ 和特殊的程式碼生成擴充套件（稱為元物件編譯器（Meta Object Compiler, moc））以及一些巨集。透過語言繫結，其他的程式語言也可以使用 Qt。

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

歷史

和於 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。

2.1 外部移植

自從諾基亞開放了 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

4.1 圖形使用者介面

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

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

4.2 訊號與槽

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

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

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

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

4.3 佈局管理

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

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

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

4.4 Main Window

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

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

4.5 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 實現的。

4.6 無障礙環境

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

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

4.7 國際化

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

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

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

4.8 多執行緒

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

4.9 語言繫結

除了 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 框架中發布

使用

7.1 使用 Qt 的 UI 環境

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

7.2 視窗管理員

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

EggWM
integrity
KWin
qlwm
deepin-wm

7.3 應用程式

一些出名的例子如下：

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 相容性良好，個人版免費。

書目