QT

来源:互联网 发布:vscode webpack插件 编辑:程序博客网 时间:2024/04/27 14:08

历史

时间Qt版本1995年Qt 1.01998年7月Qt 1.41999年4月Qt 1.4.41999年6月Qt 2.02000年4月Qt 2.12000年9月6日Qt 2.22001年10月15日Qt 3.02002年11月Qt 3.12003年7月Qt 3.22004年2月Qt 3.32005年6月27日Qt 4.02005年12月Qt 4.12006年10月Qt 4.22007年5月Qt 4.32008年5月Qt 4.42009年3月Qt 4.52009年4月Qt 4.5.12009年12月Qt 4.62010年2月Qt 4.6.22010年6月Qt 4.6.32010年9月Qt 4.72011年5月4日Qt 4.7.32011年12月15日Qt 4.82012年05月22日Qt 4.8.22012年09月13日Qt 4.8.32012年12月19日Qt 5.02013年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应用程序。并能充分利用多核架构,获得最佳运行性能,还能根据可用的处理器内核数自动调整使用的线程数。多线程程序设计也是一个执行耗时操作而不会冻结用户界面的有效典范。

[编辑]语言绑定

除了C++外,Qt还为其它多种计算机语言提供了应用程序接口,您也可以使用这些语言开发Qt应用程序。

Qt语言绑定语言名称 - 绑定描述QtCoreQtDesignerQtGuiQtNetworkQtOpenGLQtSqlQtScriptQtSvgQtTestQtUiToolsQtWebKitQtXml开放源代码软件的授权专有软件的授权AdaQtAda是是是否[32]是是否否否是否是GPLGMGPL + feeC++Qt – native C++是是是是是是是是是是是是LGPLLGPL or Proprietary + feeC# & .NETQyoto – See also Kimonofor KDE是是是是是是是是是是是是  C# & .NETqt4dotnet            LGPLLGPLD语言QtD              道语言DaoQt            LGPLLGPLHaskellQt Haskell              Harbourhbqt            GPL否JavaQt Jambi是是是是是是是是是是是是LGPLLGPLJavascript(node.js)node-qt仅有少数几个类否仅有少数几个类否否否否否仅有少数几个类否否否BSD LicenseBSD LicenseLispCommonQt – Bindings forCommon Lisp是是是是是是是是是是是是BSD LicenseBSD LicenseLualqt - Bindings是否[33]是是是否是是否否是否MITMITLuaQtLua - Bindings and script engine            LGPLLGPLPascalFreePascal Qt4              PerlPerlQt4是是是是是是是是是是是是GPL否PHPPHP-Qt是是是是是是是是是是是是LGPLLGPLPythonPyQt – has an associated text (ISBN 0132354187).是是是是是是是是是是是是GPL专有 + feePythonPySide – from OpenBossa (a subsidiary of nokia).是 是是是是是是 是是是LGPLLGPLPythonPythonQt            LGPLLGPLRqtbase是是是是是是是是是是是是GPL否RubyQtRuby是是是是是是是是是是是是LGPLLGPLTclqtcl            GPL否语言名称 - 绑定描述QtCoreQtDesignerQtGuiQtNetworkQtOpenGLQtSqlQtScriptQtSvgQtTestQtUiToolsQtWebKitQtXml开放源代码软件的授权专有软件的授权

[编辑]Qt的hello world

将下面的代码保存到Hello.cpp中

#include <QtGui/QApplication>#include <QtGui/QLabel> int main(int argc, char *argv[]){    QApplication app(argc, argv);    QLabel label("Hello, world!");    label.show();    return app.exec();}

[编辑]编译与运行

  1. 新建一个文件夹,命名为Hello
  2. 将代码Hello.cpp放入Hello文件夹
  3. 在Hello文件夹运行下列命令
    1. qmake -project
    2. qmake
    3. make/gmake/nmake
      这个取决于您的系统与编译器设置
  4. 运行./release/Hello(或release\Hello.exe in Windows)

[编辑]工具

Qt提供了一些命令行和图形工具,以方便和加速开发的过程。

  • Qt Creator:轻量级的Qt/C++ IDE开发环境。
  • qmake:跨平台构建工具,可简化跨不同平台进行项目开发的构建过程。
  • Qt Designer:界面设计师。可以用拖拽的方式将Widget排放在接口上,支持版面配置,支持信号与槽编辑。
  • Qt Assistant: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:桌面环境[34]
  • Symbian 自第四版开始
  • Unity 2D

[编辑]窗口管理器

以下的窗口管理器,使用了Qt:

  • EggWM[35]
  • integrity
  • KWin
  • qlwm