Qt
![]() 使用Qt Designer做GUI设计 | |
开发者 | Qt Project、诺基亚、Digia、KDE |
---|---|
稳定版本 | 5.0.1[1]/ 2013年1月31日 |
预览版本 | 5.0 RC2/ 2012年12月6日 |
编程语言 | C++ |
操作系统 | 跨平台 |
开发状态 | Active |
类型 | 应用程序框架 |
许可协议 | LGPL、GPL、商业授权[2] |
网站 | www.qt-project.org |
Qt(官方发音同cute 发音为 /kju:t/[3],虽然也俗称为Q.T.发音为 /kju:tiː/")是一个跨平台的C++应用程序开发框架。广泛用于开发GUI程序,这种情况下又被称为部件工具箱。也可用于开发非GUI程序,比如控制台工具和服务器。Qt使用于OPIE、Skype、VLC media player、Adobe Photoshop Elements、VirtualBox 与 Mathematica[4]以及被Autodesk [5][6]、欧洲空间局[7]、梦工厂[8][9]、Google、HP[10]、KDE、卢卡斯影业[11]、西门子公司[12]、富豪集团[13], 华特迪士尼动画制作公司[14]、三星集团[15]、飞利浦[16]、Panasonic [17] 所使用。
它是诺基亚(Nokia)的Qt Development Frameworks部门的产品。Qt使用标准的C++。通过语言绑定,其他的编程语言也可以使用Qt。
Qt是自由且开放源代码的软件,在GNU较宽松公共许可证条款下发布。所有版本都支持广泛的编译器,包括GCC的C++编译器和Visual Studio。
目录 |
[编辑]历史
时间 | 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年05月22日 | Qt 4.8.2 |
2012年09月13日 | Qt 4.8.3 |
2012年12月19日 | Qt 5.0 |
2013年01月31日 | Qt 5.0.1 |
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[18]。
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平台上。[19]
[编辑]支持平台
使用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。[20][21]
[编辑]外部移植
自从诺基亚开放了Qt的源代码给社区后,Gitorious上各种移植纷纷出现。下面是其中一部份:
- Qt for OpenSolaris –用于OpenSolaris[22]
- Qt for Haiku –用于Haiku OS[23]
- Qt for OS/2 –仍然不完整的OS/2 eCS platform移植。[24]
- Qt-iPhone –用于iPhone的实验中产品。[25]
- Android-Lighthouse –用于Android的实验中产品。[26]
- Qt for webOS –用于Palm Pre上webOS的实验中产品。[27] [28]
- Qt for Amazon Kindle DX –用于Amazon Kindle DX的实验中产品。[29]
[编辑]授权模式
Qt开放源代码,并且提供自由软件的用户协议。使得它可以被广泛地应用在各平台上的开放源代码软件开发中。
Qt提供三种授权方式。三种授权方式的功能、性能都没有区别,仅在于授权协议的不同。LGPL和GPL是免费发布,商业版则需收取授权费。[30]:
- 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—
- 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,支持跨平台应用程序播放音频和视频内容。
- Qt3Support—模块提供兼容Qt 3.х.х版本的程序库
- QtDeclarative [31] - 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应用程序。并能充分利用多核架构,获得最佳运行性能,还能根据可用的处理器内核数自动调整使用的线程数。多线程程序设计也是一个执行耗时操作而不会冻结用户界面的有效典范。