QWidget體系與QGraphicsWidget體系之間的區別

pamxy發表於2013-07-24

轉自: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


相關文章