Qt

Qt（，發音同「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。

歷史 

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

書目

参考文献

外部連結 

 中文官方网站

Qt
C++
部件工具箱
软件开发
应用程序接口