軟件特攻隊|為什麼 Qt 成為 c++ 界面編程的第一選擇?

軟件特攻隊|為什麼 Qt 成為 c++ 界面編程的第一選擇?

一、前言

為什麼說QT越來越成為界面編程的第一選擇,這要從當初為什麼從MFC轉到QT開始說。若想把MFC開發界面想做得好看一些是十分困難的一件事,引用第三方基於MFC的界面庫代碼也比較混亂,而當時看到qt有qss樣式設計這麼個功能,就決定試下。然而當項目成功移植到到QT後,真心覺得MFC可以拋棄了,MFC相較於QT缺點實在太多了。並且MFC還有一個致命的缺陷,那就是沒法跨平臺。

至於為什麼不直接使用C# WPF來做界面,如果項目和工具是C#做的,使用C++確實可以和C#互相調用,並且也能斷點調試。但是在性能上還是有不少的損失。這對於我們做音視頻和三維仿真項目是有影響的,所以只能在一些對性能沒有極致要求的項目中使用C#。

二、QT歷史

簡單來介紹一下QT歷史,知道歷史的目的是要藉此判斷使用此庫是否會有風險,是否會突然停止更新,很多開源庫就是沒有做好商業化而最終都是停掉了。

  • QT由奇趣科技公司開發

  • 2008 諾基亞從奇趣科技公司收購Qt, 並增加LGPL的授權模式

  • 2011 芬蘭的Digia從Nokia收購了Qt的商業版權,從此Nokia負責Qt on Mobile, Qt Commercial由Digia負責

QT的高峰期是在諾基亞智能手機如日中天的時候,那時候諾基亞塞班系統的手機應用大量都是基於QT研發的,但是隨著蘋果和安卓的流行,塞班無奈退出歷史舞臺。而QT的手機端開發需求也基本被替代。但是QT在嵌入式、電力系統、軍工系統中的應用一直沒有被替代。

三、QT現在使用情況

QT如今被廣泛的應用於嵌入式、電力系統、軍工系統等要與硬件交互的界面系統中,並且大量專業的跨平臺應用軟件也是使用QT開發的。

digia接手QT後開發出了安卓和IOS版本的QT,實現了跨平臺的開發。但目前仍不建議使用QT開發安卓和IOS的應用,兩個平臺坑還是比較多的,但相信會越來越完善。

四、QT提供的工具

QT不僅給我們提供了功能豐富的SDK開發包,而且提供了強大的工具,這也是我們選擇他的原因之一。

1. 基於VS插件qt-vs-addin

軟件特攻隊|為什麼 Qt 成為 c++ 界面編程的第一選擇?

2. Qt助手(手冊)

qt的開發手冊還是比較完備的,而且包含了很多示例的源碼分析。

軟件特攻隊|為什麼 Qt 成為 c++ 界面編程的第一選擇?

3. 基於XML的界面設計器Qt Designer

一款便捷的解碼設計,可以說是C++領域使用最方便的界面設計器。

軟件特攻隊|為什麼 Qt 成為 c++ 界面編程的第一選擇?

4. 跨平臺的開發工具 QtCreator

支持跨平臺的C++開發工具,而卻能夠說是在linux上使用最方便的C++開發調試工具,就算是不用QT庫,也能用它來開發跨平臺的c++項目。

軟件特攻隊|為什麼 Qt 成為 c++ 界面編程的第一選擇?

QT框架優勢

1. 工具豐富

QT提供了大量功能齊全的工具。

2. 功能豐富

除了界面庫的使用之外,QT還提供了3d庫,音頻庫,WebEngine,數據庫SDK,網絡庫等,使我們做應用變得更簡便。

3. 開源並跨平臺

除了可以通過QT源碼進行移植之外,QT官方已經提供了關於windows,Android,ios,linux中運行的SDK。

4. 架構的優勢

這部分優勢很多,首先界面源碼與用戶源碼的隔離操作,QT的策略是哪怕沒有界面都會生成一個對應的源碼文件,每一個界面設計文件xps.ui都會解析其中的xml生成一個對應的ui_xps.h 文件,這個文件你完全不需要修改,如果要調用界面中的控件直接通過 Ui::XPSClass ui;這個對象定義也是寫在ui_xps.h中。也就是說你的業務邏輯就和界面控件對象的創建和設置直接做了隔離。

其次關於事件處理的便捷(靈活的信號槽機制),QT給用戶提供了信號槽機制,以至於可以很好的降低耦合,從而提升代碼的複用性。

5. 及其便捷的樣式設計(像開發web程序一樣設計界面)

使用QT可以很容易的做一個圓角邊框,並且有漸變效果,鼠標移上去還發生變化,可以參考下面的樣式表,qss基本和css類似,包括支持css的選擇器,可以通過類名,對象名,和父類名稱來設置。

QPushButton:!hover

{

background-color: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1, stop:0 rgba(120, 120, 120, 255), stop:0.495 rgba(39, 39, 39, 255), stop:0.505 rgba(39,39, 39, 255), stop:1 rgba(120, 120,120, 255));

border-radius:5px;

}

QPushButton:hover /* hover 鼠標懸停*/

{

background-color: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1, stop:0 rgba(39, 39, 39, 255), stop:0.495 rgba(120, 120, 120, 255), stop:0.505 rgba(120,120, 120, 255), stop:1 rgba(39, 39,39, 255));

border-radius:5px; /*圓角邊框*/

}



分享到:


相關文章: