本條目存在以下問題,請協助改善本條目或在討論頁針對議題發表看法。 此條目包含指南或教學內容。 (2018年12月1日)請藉由移除或重寫指南段落來改善條目,或在討論頁提出討論。 此條目需要更新。 (2018年12月1日)請更新本文以反映近況和新增内容。完成修改後請移除本模板。
Qt
使用Qt Designer做GUI設計
使用Qt DesignerGUI設計
開發者
  • Trolltech(1991年-2008年)
  • 諾基亞(2008年-2011年)
  • Qt Project(2011年至今)
  • Digia(2012年-2014年)
  • The Qt Company(2014年至今)
当前版本
  • 6.7 Beta 1 (2023年12月20日;测试版本)[1]
  • 6.6.3 (2024年3月26日;穩定版本)[2]
編輯維基數據鏈接
源代码库 編輯維基數據鏈接
编程语言C++
操作系统跨平台
类型應用程式框架
许可协议LGPLGPL商業授權[3]
网站www.qt.io

Qt/ˈkjuːt/,發音同「cute」[4][5][6])是一个跨平台C++應用程式開發框架。廣泛用於開發GUI程式,這種情況下又被称为部件工具箱。也可用於開發非GUI程式,例如控制台工具和伺服器。Qt被用於OPIE、SkypeVLC media playerAdobe Photoshop ElementsVirtualBoxMathematica[7]以及被Autodesk [8][9]歐洲太空總署[10]夢工廠[11][12]GoogleHP[13]KDE盧卡斯影業[14]西门子公司[15]沃尔沃集团[16], 华特迪士尼动画制作公司[17]三星集团[18]飞利浦[19]Panasonic [20]所使用。

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

Haavard Nord德语Haavard NordEirik Chambe-Eng德语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[21]

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应用到AndroidiOSWindows 8平台上。[22]

支持平台

使用Qt开发的软件,相同的程式碼可以在任何支援的平台編譯與執行,而不需要修改原始碼。會自動依平台的不同,表現平台特有的图形界面风格。

外部移植

自從諾基亞開放了Qt的原始碼給社群後,Gitorious上各種移植紛紛出現。下面是其中一部份:

授权模式

Qt开放源代码,并且提供自由软件的用户协议。使得它可以被广泛地应用在各平台上的开放源代码软件开发中。

Qt提供三种授权方式。三种授权方式的功能、性能都没有区别,僅在于授权协议的不同。LGPL和GPL是免費发布,商业版則需收取授权费。[33]

Qt模块

经过多年发展,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組件都是一個widgetwidget還可以作為容器,在其內包含其他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來自訂版面配置管理員。

Main Window

Qt提供了下列主視窗管理和相關的用戶界面組件的類別:

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語言綁定
語言 名稱 - 綁定描述 QtCore QtDesigner QtGui QtNetwork QtOpenGL QtSql QtScript QtSvg QtTest QtUiTools QtWebKit QtXml 開放原始碼軟體的授權 專有軟體授權
Ada QtAda [35] 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
Javascriptnode.js node-qt页面存档备份,存于互联网档案馆 僅有少數幾個類 僅有少數幾個類 僅有少數幾個類 BSD License BSD License
Lisp CommonQt页面存档备份,存于互联网档案馆) – Bindings for Common Lisp BSD License BSD License
Lua lqt页面存档备份,存于互联网档案馆) - Bindings [36] 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 Solutions提供Qt額外的組件和工具,使Qt的開發更有效率。在Qt 4.5之後,Qt Solutions加入了LGPL的授權

使用

使用Qt的UI環境

視窗管理員

以下的視窗管理員,使用了Qt:

應用程式

一些出名的例子如下:

参见

書目

参考文献

  1. ^ Qt 6.7 Beta 1 Released. 2023年12月20日 [2023年12月20日] (英語). 
  2. ^ Qt 6.6.3 Released. 2024年3月26日 [2024年3月26日] (英語). 
  3. ^ Qt Licensing. [2010-02-19]. (原始内容存档于2009-08-09). 
  4. ^ Qt - About Us. [2016-04-23]. (原始内容存档于2016-04-12). 
  5. ^ That Smartphone Is So Qt. Ashlee Vance. 2010-02-16 [2010-02-19]. (原始内容存档于2011-10-07). 
  6. ^ The Qt 4 Dance (video). [2015-09-07]. (原始内容存档于2015-12-01). 
  7. ^ Qt delivered advanced, cross-platform C++ GUI for Mathematica’s development team. (原始内容存档于2012-02-03). 
  8. ^ Qt in Autodesk. [2010-09-26]. (原始内容存档于2011-07-23). 
  9. ^ Qt in visual effects. [2010-09-26]. (原始内容存档于2011-07-23). 
  10. ^ Qt in the European Space Agency. [2010-09-26]. (原始内容存档于2011-07-23). 
  11. ^ Behind the Scenes at DreamWorks Animation: Making the Apps that Make the Movies. [2011-10-30]. (原始内容存档于2012-02-03). 
  12. ^ UI & System Design Challenges for the NxG Lighting Tool. [2011-10-30]. (原始内容存档于2012-02-03). 
  13. ^ Developing Innovative Desktop and Embedded HP Products with Qt. [2011-10-30]. (原始内容存档于2012-02-03). 
  14. ^ Lucasfilm Entertainment Company Ltd.. [2011-10-30]. (原始内容存档于2012-02-03). 
  15. ^ Qt helped Siemens deliver a C++ development platform for manufacturing software GUIs. [2011-03-05]. (原始内容存档于2011-07-14). 
  16. ^ Volvo Mobility Systems. [2011-03-05]. (原始内容存档于2012-02-03). 
  17. ^ Qt helped Walt Disney reduce development time spent on its cross-platform feature film production application. [2011-03-05]. (原始内容存档于2012-02-03). 
  18. ^ Qt in Home Media. [2010-09-26]. (原始内容存档于2011-07-23). 
  19. ^ Qt in IP Communications. [2010-09-26]. (原始内容存档于2011-07-23). 
  20. ^ Panasonic selects Qt for HD video system. [2010-09-26]. (原始内容存档于2011-07-23). 
  21. ^ A Brief History of Qt. [2007-12-20]. (原始内容存档于2008-06-30). 
  22. ^ Digia完成收购诺基亚已交出Qt全部业务_科技频道_凤凰网. [2012-08-18]. (原始内容存档于2012-09-19). 
  23. ^ Getting started with Lighthouse. [17 December 2010]. (原始内容存档于2010年10月25日). 
  24. ^ Kristian Høgsberg. Add wayland lighthouse plugin. 25 January 2011 [2011年10月30日]. (原始内容存档于2013年5月14日). 
  25. ^ KDE on OpenSolaris. [2010-03-21]. (原始内容存档于2010-02-20). 
  26. ^ 存档副本. [2010-01-30]. (原始内容存档于2010-03-07). 
  27. ^ Qt 4 Application and UI Framework for eCS. [2010-01-30]. (原始内容存档于2010-01-19). 
  28. ^ 存档副本. [2010-01-30]. (原始内容存档于2010-02-06). 
  29. ^ 存档副本. [2010-01-30]. (原始内容存档于2010-01-26). 
  30. ^ Qt webOS port[永久失效連結]
  31. ^ Blog: Qt on the Palm Pre. [2010-03-21]. (原始内容存档于2010-03-11). 
  32. ^ Blog: Qt on Amazon Kindle DX. [2010-03-21]. (原始内容存档于2010-03-06). 
  33. ^ 存档副本. [2009-03-31]. (原始内容存档于2009-03-26). 
  34. ^ 存档副本. [2010-09-26]. (原始内容存档于2010-03-15). 
  35. ^ 存档副本. [2013-04-26]. (原始内容存档于2012-07-23).  Supported Qt modules in QtAda
  36. ^ [1]页面存档备份,存于互联网档案馆) Supported Qt modules in lqt
  37. ^ Razor-qt Project. 
  38. ^ Egg Window Manager. [2011-10-30]. (原始内容存档于2011-11-22). 
  39. ^ Qt Software—Adobe Photoshop Elements Album. [2009-12-27]. (原始内容存档于2009-07-20). 
  40. ^ TOra uses the Qt library. [2009-12-27]. (原始内容存档于2009-07-01). 
  41. ^ Qt为中国移动音乐客户端提供多平台支持. [2011-03-08]. (原始内容存档于2011-01-05). 

外部連結