QWidget體系與QGraphicsWidget體系之間的區別
轉自:http://blog.csdn.net/nrc_douningbo/article/details/5571149
在NOKIA reserch center做過的兩個Qt專案,每個專案分別都做了三個版本,一個是QWidget體系版本,一個是QGraphicsWidget體系版本,一個則是Orbit版本。
首先解釋下三者之間的關係:
①:QWidget體系是我們平時最常用的Qt體系,亦即其中所有使用的視窗類都是QWidget或其派生類!
②:QGraphicsWidget體系則是《c++ GUI Qt4程式設計(第二版)》中第8章8.4所講的基於項的圖形檢視架構:
書上的稱呼是:Qt的檢視體系。
其主視窗MainWindow類框架的一般寫法為:
//MainWindow.h
class MainWindow : public QGraphicsView
{
Q_OBJECT
public:
MainWindow(QWidget *parent = 0);
~MainWindow();
private:
QGraphicsScene * iScene;
};
//MainWindow.cpp
MainWindow::MainWindow(QWidget *parent): QGraphicsView(parent)
{
iScene = new QGraphicsScene();
//此處建立各個item項,並加入到上邊建立的scene場景中。
this->setScene(iScene);
}
亦即:此時主視窗是一個view場景,而我們是在其中建立了並設定了一個含有很多item項的scene場景而已。
個人認為:官方教材對這部分講解太多簡略!就拿出一章的一節來講解實在是不應該,理由是(希望不會牽扯商業機密,僅僅談技術):Qt自從被NOKIA收購之後,大家都知道以後等到symbian4的時候:整個symbian OS框架都會拋棄原有複雜的AvKon框架,而轉而使用Qt,但是這裡使用的Qt並非通常意義上的Qt,它是對Qt再次進行了封裝,新增了很多針對移動終端的新功能。而封裝的基礎則就是上邊所說的場景檢視體系!! 亦即:以後NOKIA主推的Qt開發技術就是使用上邊所有的QGraphicsWidget體系的,而非我們平時常使用的QWidget體系!!
1:有人可能會問:為什麼使用項檢視這個QGraphicsWidget體系,而不用QWidget體系?這裡邊原因太多了,舉個最簡單的例子:在手機中當你橫豎屏轉換時,你肯定希望此時開啟的應用程式也跟著橫豎屏旋轉。如果這個程式是一個Qt程式,則是指:Qt中的視窗需要可以旋轉!! 對於這一點:QWidget是做不到的!亦即一個QWidget視窗無法實現旋轉(頂多是上邊刷的內容旋轉,但是視窗本身不會旋轉)! 但是QGraphicsItem則可以直接旋轉!基於很多這樣的理由,所以NOKIA選擇了QGraphicsWidget體系。
2:也有人會問:你上邊說每個專案都做了三個版本,這第三種版本是什麼?其實這第三種版本就是以後symbian3 symbian4中所有的再次封裝後的Qt,亦即:在GraphicsWidget體系基礎上新增一些新功能封裝後的新SDK。 這個東西SDK的內部代號叫Orbit,不知道對外發布時名稱是什麼,這裡暫且就還是稱呼它為Orbit吧。(我們當時開發的時候,Orbit也也還是在開發過程中,每天我們都要去伺服器上版本控制拉下最新的版本來用)
3:等到了symbian3,手機中已經內建了Qt的庫並做了優化,此時依舊可以使用symbian c++那一套來開發手機程式,也可以用Qt來開發,兩者相容。第一款symbian3手機N8馬上就要上市了,已經出了宣傳片了,前兩天在組裡玩過它的原型機,挺玄。 而等到了symbian4, symbian原本那一套AvKon框架就徹底廢除了,只能用Qt來開發了!(這些訊息是前段時間參加NOKIA在北航舉辦的Qt培訓時:聽NOKIA forum部門的人說的,所以好好學Qt還是很有前景的。)
基於以上原因,還是需要我們好好學學QGraphicsWidget體系的!!尤其是現在玩這一架構的人很少。
③:Orbit體系,正如上邊所說,它是對QGraphicsWidget進行了再次封裝之後,用於symbian3 symbian4的Qt版本!
總結:Qt主要分QWidget體系和QGraphicsWidget體系(檢視體系),而Orbit則是對後者的再封裝!!
===============================================================================
通過上邊的介紹,大家初步瞭解了三者的關係,但是很多人會說了:我平時一直用的QWidget體系,現在轉到QGraphicsWidget體系是不是很困難?是不是以前學的都沒什麼幫助了? 其實這個轉換也不怎麼困難。
首先:整個應用程式框架上邊已經給出了,只不過變為場景檢視項而已。
其次:其實在後者的場景中我們不僅僅可以新增Item項,更可以直接新增QWidget!!這樣的話,我們平時開發完全可以還按照QWidget體系那一套來寫,只不過最後將他們都挨個加到scene中即可!!!而新增QWidget是用scene的 addWidget函式!!這也是我平時開發時最常用的方式!!
雖然QGraphicsView繼承自QWidget,但是這兩種體系之間的區別非常非常大,以至於很多相同的操作在這兩種架構下的設定方法都不一樣! 這也是我們對一些問題進行探討時候都要分這兩種情況進行的原因!(比如:如何使QTextEdit背景透明? 這在這兩種架構下設定方法是不一樣的,詳見文章http://blog.csdn.net/NRC_DouNingBo/archive/2010/05/09/5571088.aspx)
相關文章
- 宏旺半導體解答ECC與RECC記憶體之間的區別記憶體
- Linux和windows系統之間的區別LinuxWindows
- Oracle與OpenJDK之間的區別OracleJDK
- PrepareStatement與Statement之間的區別REST
- 指標體系與分析體系指標
- 企業資訊體系與系統體系
- GCD與NSOperation之間的區別GC
- PHP abstract與interface之間的區別PHP
- 多維度對比 SAP(思愛普)和Oracle(甲骨文)金蝶、用友系統軟體之間的區別!Oracle
- 正版系統與盜版系統的區別
- 耦合與聚合的區別比單體與微服務區別更重要微服務
- 雲與本地部署 ERP 之間的區別
- size resize與capacity reserve之間的區別
- Java之Throwable體系Java
- 【轉】QT中QWidget、QDialog及QMainWindow的區別QTAI
- 記憶體的SDR與DDR的區別記憶體
- 【JVM之記憶體與垃圾回收篇】JVM與Java體系結構JVM記憶體Java
- Go 語言 := 的具體使用與區別Go
- 幽默:哲學與軟體工程的區別軟體工程
- C# 結構體與類的區別C#結構體
- 深度學習與機器學習之間區別 - javaworld深度學習機器學習Java
- [譯]HTML attribute與DOM property之間的區別?HTML
- TCP、UDP、HTTP、SOCKET之間的區別與聯絡TCPUDPHTTP
- 陣列地址與指標之間的區別與聯絡陣列指標
- 大資料分析與機器學習之間的區別與聯絡大資料機器學習
- 軟體驗收測試和系統測試的區別點
- [Virtualization]ESXi體系結構與記憶體管理(一)體系結構記憶體
- Git與其他版本控制系統的區別Git
- ARM的體系結構與程式設計系列部落格——ARM體系版本程式設計
- 系統呼叫lseek和核心file結構體之間的關係結構體
- 系統時間和硬體時間同步
- 解讀架構,框架,模式,構件,元件,中介軟體之間區別架構框架模式元件
- SAP與非SAP系統之間的EDI
- 軟體定製開發與SaaS的區別
- C++中結構體與類的區別C++結構體
- Java中Statement與PreparedStatement與CallableStatement之間的區別 - javarevisitedJava
- 淺析HTML、CSS、JavaScript之間的聯絡與區別!HTMLCSSJavaScript
- 簡單介紹HTTP與HTTPS之間的區別HTTP