Remove ads
面向對象的用於建立圖形用戶界面的框架 来自维基百科,自由的百科全书
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:
一些出名的例子如下:
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.