Qt是一個跨平台的C 圖形用戶界面應用程序框架。它早在1991年奇趣科技公司兩位合夥人着手開發這樣一個平台,在2008年如日中天的諾基亞由于看好Qt在嵌入式領域的潛力,一擲千金将它收購作為新一代智能手機操作系統的載體,但是因為諾基亞在智能手機領域的敗北,不得已而放手Qt,終于Qt于2012被最後一位東家 Digia 公司收購。經過這幾年的發展,Qt不但擁有了完備的C 圖形庫,而且也極大的提高了Qt開發跨平台應用程序的能力。
Qt可以同時支持桌面應用程序開發、嵌入式開發和移動開發,甚至它可以做移動開發,覆蓋了現有的所有主流平台。你隻需要編寫一次代碼,發布到不同平台前重新編譯即可。
哪些産品都是用Qt開發的?Qt憑借一套對原生Windows、Mac、Linux等平台支持很好的 GUI 庫和豐富的 API 庫,使得它成為了開發跨平台桌面應用的一個很好的選擇。與中國一些優秀的桌面端軟件選擇自己開發多平台的 GUI 庫不同,國外的很多優秀桌面應用都偏好采用跨平台的 GUI 庫進行開發。比如在矽谷有一款很著名的文檔管理應用 DropBox,微軟自家的社交聊天工具 Skype,像很多大型的遊戲的GUI頁面,甚至國内的金山軟件公司推出的辦公軟件 WPS Office,當然還有我們的AlphaBox。
為什麼AlphaBox選擇Qt?因為Qt不僅能夠高效率的完成不同平台GUI内容的開發,更能夠高效率的完成系統級别的一些任務。這也是AlphaBox選擇使用Qt開發的原因。
AlphaBox 其實包含兩個主要的進程,一塊是同步盤的引擎—C語言構建的底層同步進程,我們稱之為 daemon;剩下的圖形頁面以及與操作系統交互的模塊都是使用Qt進行開發的。Qt提供的豐富的跨平台GUI組件能夠保證在不同操作系統中 AlphaBox 都有着美觀和吻合操作系統的樣式,Qt自家生産的 IDE—Qt Creator 提供了一套非常好上手的圖形界面構建工具,即使是剛接觸Qt的小白也可以輕松的繪制出想要的頁面并且能夠完成核心頁面邏輯。除此之外,得益于 C 的加持,Qt與操作系統有着非常健壯的通信機制,憑借這一點,AlphaBox 能夠輕松完成精準監控操作系統中文件的改動、建立本地數據庫進行寫入數據的等操作,不僅于此,優秀的混合編程能力能夠讓Qt輕松的與 Objective-C、C# 等語言進行混編,實現系統級别擴展的調用,這就是我們能夠在 Finder 和Windows 資源管理器中能夠看到同步盤文件不同狀态的原因了。
Qt優勢優良的跨平台特性Qt支持 Windows、Linux/Unix、Mac OS X、Android、BlackBerry、QNX等多種平台,并為這些不同的平台提供了統一的開發環境。
【更多音視頻 QT學習資料,點擊下方鍊接免費領取↓↓,先碼住不迷路~】
點擊領取→音視頻開發基礎知識和資料包
面向對象C 是完全面向對象的,這一點和Objective-c等在開發很相似。而Qt又是基于C 一種語言的擴展,大家都知道C 有快速、簡易、面向對象等很多優點,所以Qt自然也繼承者C 這些的優點。
Qt良好的封裝機制使得Qt的模塊化程度非常高,可重用性較好,對用戶開發來貨是非常方便的。Qt提供一種為signals/slots(信号和槽) 的安全類型來替代callback,使得各個元件之間的協同工作變得十分簡單。
豐富的APIQt包括多達 250 個以上的 C 類,還提供基于模闆的 collections, serialization, file, I/Odevice, directory management, date/time 類。甚至還包括正則表達式的處理功能。支持 2D/3D 圖形渲染,支持 OpenGL。大量的開發文檔。
XML支持Webkit 引擎的集成,可以實現本地界面與Web内容的無縫集成, 但是真正使得 Qt 在自由軟件界的衆多 Widgets (如 Lesstif,Gtk,EZWGL,Xforms,fltk 等等)中脫穎而出的還是基于 Qt 的重量級軟件 KDE。
信号和槽機制Qt提供了信号和槽機制用于完成見面操作的響應,是完成任意兩個Qt對象之通信機制。其中,信号會在某個特定情況或動作下被觸動,槽是等同于接受并處理信号的函數。
為什麼方法不是直接調用的。中間用到 Signal 和槽機制不是多此一舉?
其實在我們生活也是一樣,老闆級别的好說話,老闆給助理分派任務也好說話,但是助理給老闆分任務,可想而知會有什麼後果,在以前的統治階層肯定不允許這樣的事發生。所以在分層思想中,我們所調用的函數也是這樣的,上層可以調用下層和同一層的函數,下層函數不可以調用上層函數,否則程序的層次性會被打破,導緻結構錯綜複雜,難以維護和管理。
那麼怎樣才能做到向上管理呢,有任務分配給老闆怎麼辦?
老闆會設立一個機構,也就是一個函數,用無限循環來查詢助理的狀态,如果助理真的有事情,這個機構就把這消息拿到老闆來處理。但是這種處理方式顯得有些複雜,我們想要的簡單明了的方式是,如果助理有事件發生,可以直接調用老闆函數處理。
說了這麼多其實就是想說,信号和槽的最大優勢在于,它完善了程序分層的思想,可以在不改變程序的層次性的情況下,完成由下層到上層的調用。在下層發出一個 Signal,這時上層與其想關聯的 Slot 函數就會響應。
現在,信号和槽中存在的問題是:
要想解決以上問題,就需要将相應的信号和槽連接起來。當指定的信号發出時,槽所在的對象就能接收到該信号,從而調用相應的槽函數執行指定的處理。
信号與槽的連接方式1.一個信号可以與另一個信号相連
現在,信号和槽中存在的問題是:
要想解決以上問題,就需要将相應的信号和槽連接起來。當指定的信号發出時,槽所在的對象就能接收到該信号,從而調用相應的槽函數執行指定的處理。
信号與槽的連接方式1.一個信号可以與另一個信号相連
connect (Object1,SIGNAL(signal1),Object2,SIGNAL(signal2));
表示 Object1的信号1發送可以觸發Object2的信号1發送。
2.同一個信号可以與多個槽相連:
connect (Object1,SIGNAL(signal2),Object2,SIGNAL(slot2));
connect (Object1,SIGNAL(signal2),Object3,SIGNAL(slot1));
3.同一個槽可以響應多個信号:
connect (Object1,SIGNAL(signal2),Object2,SIGNAL(slot2));
connect (Object3,SIGNAL(signal2),Object2,SIGNAL(slot2));
4.連接可以被移除:
這種情況用得比較少,因為在對象被删除時,Qt會自動移除與這個對象相關的所有連接。
disconnect(sender, SIGNAL(signal), receiver, SLOT(slot));
但是,常用的連接方式為:
connect (Object1,SIGNAL(signal),Object2,SIGNAL(slot));
其中,signal 為對象Object1的信号,slot 為Object2的槽。
####提示: 信号與槽機制與普通函數的調用一樣,如果使用不當的話,在程序執行時也有可能産生死循環。因此,在定義槽函數時一定要注意避免間接形成無限循環,即在槽中再次發射所接收到的同樣信号。如果一個信号與多個槽相聯系的話,那麼,當這個信号被發射時,與之相關的槽被激活的順序将是随機的。宏定義不能用在 signal 和 slot 的參數中。信号和槽的參數個數與類型必須一緻。
信号和槽機制優點類型安全需要關聯的信号和槽的簽名必須是等同。即信号的參數類型和參數個數 同接收該信号的槽的參數類型和參數個數相同。不過一個槽的參數個數是可以少于信号的參數的個數的,但是缺少的參數必須是信号參數的最後一個或者幾個參數。如果信号和槽的簽名不符,編譯器就會報錯。
松散耦合信号和槽機制大大降低了Qt對象的耦合度。發送信号的Qt對象不需要知道是哪個對象來接收它的信号,它隻需要做的是在适當的時間發送一個信号,而且不需要知道也不關心它的信号有沒有被接收到,更不需要知道哪個對象的哪個槽接收到了信号。
同樣地,Qt對象的槽也不需要關系是哪些信号連接了自己,如果信号和槽連接上了,Qt就能保證了适合的槽得到了調用。即使關聯的對象在運行時被删除。應用程序也不會崩潰。
信号和槽的效率信号和槽機制增強了對象間通信的靈活性,當然在增加靈活性的同時在性能方面也會有一定的損失。同大家回調函數相比,信号和槽機制運行速度有些慢。通常,通過傳遞一個信号來調用槽函數将會比直接調用直接調用非虛函數運行速度慢10倍。
【更多音視頻 QT學習資料,點擊下方鍊接免費領取↓↓,先碼住不迷路~】
點擊領取→音視頻開發基礎知識和資料包
原因:
然而,與創建堆對象的new操作及删除堆對象的delete操作相比,信号和槽的運行代價隻是它們很少一部分。信号和槽機制導緻的這點性能損耗,對實時應用程序是可以忽略的;同信号和槽提供的靈活性和簡便性相比,這點性能損耗是值得的。
Qt 布局系統介紹布局系統作為一名 iOS 開發人員, 見證着 iOS 布局系統的不斷完善, 從絕對布局, Autoresizing 到 Autolayout. 使得開發人員的工作效率越來越高, 項目界面的可讀性和易維護性越來越強. 如今 IDE 中的可視化界面工具已經非常強大, 許多網友"戲稱" iOS 開發者為"UI 拖拽師", 可見, iOS 開發中界面布局系統的高效. 所以, 優秀的布局系統的使命在于讓開發者花更少的時間來完成更易維護的界面.
同樣的, 在 Qt 中, 系統提供了強大的排版機制來為窗口中的視圖進行布局排版, 經過了對 Qt 布局一個初步的探索, 不得不對 Qt 布局系統的簡潔高效而又功能強大表示贊歎.
布局系統的功能在 Qt 中, 布局系統可以完成
Qt 提供了 QLayout 類及其子類來為界面進行排版布局. 結構如下圖:
QLayout 是布局系統中的抽象基類, 繼承自 QObject 和 QLayoutItem, 其中四個子類分别為
在真實使用場景中, 往往需要通過多種布局的相結合來完成界面的設計, 接下來将分别介紹四中布局.
QBoxLayout 箱式布局箱式布局提供了兩個子類分别處理水平(QHBoxLayout)和垂直(QVBoxLayout)兩個方向的排版, 可以使視圖排成一行或者一列來顯示. 簡單說, 就是可以讓控件進行排排站, 比如在我們的 AlphaBox 中, 頂部的頭像, 姓名, 和刷新按鈕排成了一排, 這就是水平箱式布局:
你以為我要講一下這個東西如何實現? NO, 我偏偏要以垂直箱式布局為例, 用一個最簡單的例子來介紹箱式布局的使用, 首先創建一個基于 QWidget 的界面, 添加我們需要使用的頭文件:
#include <QVBoxLayout>
#include <QPushButton>
并在構造函數中添加如下代碼
// 添加兩個按鈕
QPushButton *okBtn = new QPushButton;
okBtn ->setText(tr("我在上面, 我最牛"));
QPushButton *celBtn = new QPushButton;
celBtn->setText(tr("我在下面, 我不服"));
// 創建一個垂直箱式布局, 将兩個按鈕扔進去
QVBoxLayout *layout = new QVBoxLayout;
layout->addWidget(okBtn);
layout->addWidget(celBtn);
// 設置界面的布局為垂直箱式布局
setLayout(layout);
運行看一下效果, 什麼? 這就可以運行了? 坐标呢? 尺寸呢? 是的, 沒看錯...點擊運行:
兩個按鈕已經一上一下, 乖乖的在垂直方向自己站好了位置, 就是這麼強大, 就是這麼省心.
QFormLayout 表單布局強大的 AlphaBox 是很外向的, 可以很輕松的将你的資料分享給其他用戶, 當我們分享的時候, 會有這樣一個界面:
看到這個界面, 聰明的你可能會說, 這很簡單啊, 好幾個水平箱式布局就可以實現, 可是, 更聰明的 Qt 提供了更高效的方式幫助你完成這樣一個界面, 那就是 QFormLayout.
在我所學習 Qt 所使用的書籍中, 将 QFormLayout 翻譯為窗體布局, 我個人認為, 将其翻譯為表單布局更為貼切, 因為 QFormLayout 的強大之處正是可以使用最快的速度完成一個用戶輸入的表單界面的搭建.
那麼, 讓我們揭開 AlphaBox 的神秘面紗, 看看這樣一個界面是怎麼實現的.
首先, 拖拽一個 Form Layout 到 Widget 中.
雙擊之後即可為表單增加一行.
相信大家看到這張圖時, 就已經能理解到表單布局是如何使用的, 提供了标簽作為用戶輸入内容的指引, 提供字段類型作為用戶輸入的控件, 作為 iOS 開發者, 深知這樣一個界面的搭建所需要的繁雜的工作量. 當我第一次打開這個界面時, 被這樣創建界面的方式所驚呆了.
【更多音視頻 QT學習資料,點擊下方鍊接免費領取↓↓,先碼住不迷路~】
點擊領取→音視頻開發基礎知識和資料包
快不快? 快不快! 快不快!!!
同樣的, 如果是使用純代碼表單布局的話可以使用addRow()的方法來添加一行.
QGridLayout 網格布局
事實上, 強大的 AlphaBox 是這樣的, 我們可以共享給多個用戶, 而且, 下方會有一個列表, 展示共享的用戶以及權限列表. 這時, 表單布局就沒辦法滿足我們, 隻好另求新歡 QGridLayout - 網格布局.
網格布局顧名思義, 可以将界面分割成行列來進行布局管理, 在每個單元格中來擺放控件. 所以 AlphaBox 分享的界面使用了一個 兩行三列 的網格布局來實現的.
當然, 更更複雜的界面, 用 Qt 布局的效率也是非常高的, 我做了一個外鍊分享的布局 Demo, 可以将内部資料生成一個下載鍊接共享給任何人去下載.
這個界面中, 我在Tab之内使用了網格布局, 布局如圖:
從圖中可以看出, 網格布局像是在操作一個 Excel 一樣簡單, 布局單元格, 合并單元格, 等等.
在這個界面中, 更靈活的使用了 QLayout 的屬性來完成了界面布局排版.
同樣的, 在代碼中, 可以使用如下等的 Api 來為網格視圖添加一個從幾行幾列開始占據幾行幾列的控件:
void addWidget(QWidget *, int row, int column, int rowSpan, int columnSpan)
QStackedLayout 棧布局如在 AlphaBox 中, 我們可以通過雲端文件浏覽器直接查看和操作雲端文件, 在加載的過程中, 會有一個轉菊花的界面.
加載失敗時的錯誤提示:
以及加載成功時:
通常應用的界面會根據不同的狀态有不同的内容, 這時就可以使用 QStackedLayout 棧布局, 棧布局提供了一個頁面的棧, 每個頁面有完全獨立的界面布局. 可以非常清晰的對不同狀态下的界面進行布局管理.
在 Qt 的可視化布局工具中, 通過 Stacked Widget 來完成界面的棧布局
通過右鍵來進行頁面的插入移除和排序等操作.
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!