Qt

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

**外部移植**
自从诺基亚开放了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兼容性良好，个人版免费。- 微信4.0

**参见**
 Qt公司- Qt Quick- QML- Advanced Component Framework

**书目**

**参考文献**

**外部连结**-  中文官方网站date=20180710010337