Loading AI tools
面向對象的用於建立圖形用戶界面的框架 来自维基百科,自由的百科全书
Qt(/ˈkjuːt/,发音同“cute”[3][4][5])是一个跨平台的C++应用程式开发框架。广泛用于开发GUI程式,这种情况下又被称为部件工具箱。也可用于开发非GUI程式,例如控制台工具和伺服器。Qt被用于OPIE、Skype、VLC media player、Adobe Photoshop Elements、VirtualBox与Mathematica[6]以及被Autodesk [7][8]、欧洲太空总署[9]、梦工厂[10][11]、Google、HP[12]、KDE、卢卡斯影业[13]、西门子公司[14]、沃尔沃集团[15], 华特迪士尼动画制作公司[16]、三星集团[17]、飞利浦[18]、Panasonic [19]所使用。
![]() |
Qt使用标准的C++和特殊的代码生成扩展(称为元对象编译器(Meta Object Compiler, moc))以及一些巨集。通过语言绑定,其他的程式语言也可以使用Qt。
Qt是自由且开放原始码的软体,在GNU较宽松公共许可证(LGPL)条款下发布。所有版本都支援广泛的编译器,包括GCC的C++编译器和Visual Studio捆绑的MSVC编译器。
时间 | Qt版本 |
---|---|
1995年 | Qt 1.0 |
1998年7月 | Qt 1.4 |
1999年4月 | Qt 1.4.4 |
1999年6月 | Qt 2.0 |
2000年4月 | Qt 2.1 |
2000年9月6日 | Qt 2.2 |
2001年10月15日 | Qt 3.0 |
2002年11月 | Qt 3.1 |
2003年7月 | Qt 3.2 |
2004年2月 | Qt 3.3 |
2005年6月27日 | Qt 4.0 |
2005年12月 | Qt 4.1 |
2006年10月 | Qt 4.2 |
2007年5月 | Qt 4.3 |
2008年5月 | Qt 4.4 |
2009年3月 | Qt 4.5 |
2009年4月 | Qt 4.5.1 |
2009年12月 | Qt 4.6 |
2010年2月 | Qt 4.6.2 |
2010年6月 | Qt 4.6.3 |
2010年9月 | Qt 4.7 |
2011年5月4日 | Qt 4.7.3 |
2011年12月15日 | Qt 4.8 |
2012年5月22日 | Qt 4.8.2 |
2012年9月13日 | Qt 4.8.3 |
2012年12月19日 | Qt 5.0 |
2013年1月31日 | Qt 5.0.1 |
2013年4月10日 | Qt 5.0.2 |
2013年7月3日 | Qt 5.1 |
2013年8月28日 | Qt 5.1.1 |
2013年12月12日 | Qt 5.2 |
2014年5月20日 | Qt 5.3 |
2014年12月10日 | Qt 5.4 |
2015年7月1日 | Qt 5.5 |
2016年3月16日 | Qt 5.6 |
2016年6月16日 | Qt 5.7 |
2017年1月23日 | Qt 5.8 |
2017年5月31日 | Qt 5.9 |
2017年11月30日 | Qt 5.10 |
2018年5月22日 | Qt 5.11 |
2019年1月31日 | Qt 5.12 |
2019年6月19日 | Qt 5.13 |
2019年12月12日 | Qt 5.14 |
2020年5月26日 | Qt 5.15 |
2020年12月1日 | Qt 6.0 |
2021年4月27日 | Qt 6.1 |
2021年9月28日 | Qt 6.2 |
2022年3月16日 | Qt 6.3 |
2022年9月29日 | Qt 6.4 |
2023年3月30日 | Qt 6.5 |
2023年9月26日 | Qt 6.6 |
2024年3月19日 | Qt 6.7 |
预计 2024年9月25日 | Qt 6.8 |
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[20]。
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平台上。[21]
使用Qt开发的软件,相同的程式码可以在任何支援的平台上编译与执行,而不需要修改原始码。会自动依平台的不同,表现平台特有的图形界面风格。
自从诺基亚开放了Qt的原始码给社群后,Gitorious上各种移植纷纷出现。下面是其中一部份:
Qt开放源代码,并且提供自由软件的用户协议。使得它可以被广泛地应用在各平台上的开放源代码软件开发中。
Qt提供三种授权方式。三种授权方式的功能、性能都没有区别,仅在于授权协议的不同。LGPL和GPL是免费发布,商业版则需收取授权费。[32]:
经过多年发展,Qt不但拥有了完善的C++图形库,而且近年来的版本逐渐整合了数据库、OpenGL库、多媒体库、网络、脚本库、XML库、WebKit库等等,其核心库也加入了进程间通信、多线程等模块,极大的丰富了Qt开发大规模复杂跨平台应用程序的能力,真正意义上实现了其研发宗旨“Code Less; Create More; Deploy Anywhere”。
由于各家编译器规格不同,Qt本身为了跨平台相容性,只能以“最低相容规格”来设计。因此Qt必须具备RTTI、动态创建、Persistence/Serialization的基础建设,以及建构出自己的容器元件。
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来自订版面配置管理员。
Qt提供了下列主视窗管理和相关的用户界面组件的类别:
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应用程序。
语言 | 名称 - 绑定描述 | QtCore | QtDesigner | QtGui | QtNetwork | QtOpenGL | QtSql | QtScript | QtSvg | QtTest | QtUiTools | QtWebKit | QtXml | 开放原始码软体的授权 | 专有软体的授权 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Ada | QtAda | 是 | 是 | 是 | 否[34] | 是 | 是 | 否 | 否 | 否 | 是 | 否 | 是 | GNU GPL | GMGPL + fee |
C++ | Qt – native C++ | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | LGPL | LGPL or Proprietary + fee |
C# & .NET | Qyoto – See also Kimono for KDE | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | ||
C# & .NET | qt4dotnet(页面存档备份,存于互联网档案馆) | LGPL | LGPL | ||||||||||||
D语言 | QtD(页面存档备份,存于互联网档案馆) | ||||||||||||||
道语言 | DaoQt(页面存档备份,存于互联网档案馆) | LGPL | LGPL | ||||||||||||
Haskell | Qt Haskell | ||||||||||||||
Harbour | hbqt | GNU GPL | 否 | ||||||||||||
Java | Qt Jambi | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | LGPL | LGPL |
Javascript(node.js) | node-qt(页面存档备份,存于互联网档案馆) | 仅有少数几个类 | 否 | 仅有少数几个类 | 否 | 否 | 否 | 否 | 否 | 仅有少数几个类 | 否 | 否 | 否 | BSD License | BSD License |
Lisp | CommonQt(页面存档备份,存于互联网档案馆) – Bindings for Common Lisp | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | BSD License | BSD License |
Lua | lqt(页面存档备份,存于互联网档案馆) - Bindings | 是 | 否[35] | 是 | 是 | 是 | 否 | 是 | 是 | 否 | 否 | 是 | 否 | MIT | MIT |
Lua | QtLua(页面存档备份,存于互联网档案馆) - Bindings and script engine | LGPL | LGPL | ||||||||||||
Pascal | FreePascal Qt4(页面存档备份,存于互联网档案馆) | ||||||||||||||
Perl | PerlQt4(页面存档备份,存于互联网档案馆) | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | GNU GPL | 否 |
PHP | PHP-Qt | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | LGPL | LGPL |
Python | PyQt – has an associated text (ISBN 0132354187). | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | GNU GPL | 专有 + fee |
Python | PySide – from OpenBossa (a subsidiary of nokia). | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | LGPL | LGPL | ||
Python | PythonQt(页面存档备份,存于互联网档案馆) | LGPL | LGPL | ||||||||||||
R | qtbase(页面存档备份,存于互联网档案馆) | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | GPL | 否 |
Ruby | QtRuby | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | LGPL | LGPL |
Tcl | qtcl(页面存档备份,存于互联网档案馆) | GNU GPL | 否 | ||||||||||||
语言 | 名称 - 绑定描述 | QtCore | QtDesigner | QtGui | QtNetwork | QtOpenGL | QtSql | QtScript | QtSvg | QtTest | QtUiTools | QtWebKit | QtXml | 开放原始码软体的授权 | 专有软体的授权 |
Qt提供了一些命令列和图形工具,以方便和加速开发的过程。
Qt Solutions提供Qt额外的组件和工具,使Qt的开发更有效率。在Qt 4.5之后,Qt Solutions加入了LGPL的授权
以下的视窗管理员,使用了Qt:
一些出名的例子如下: