Qt中各個widget前后位置的設定(轉)


這兩天在總結一些以往project中遇到的問題,正好別組有同事問我關於Qt中各個widget窗口的前后位置是如何定義的,這里就總結一下:

      在Qt中,所有問題都要一分為二,討論兩種不同的情況:一個是最常用的QWidget體系,而另外一個則是QGraphicsWidget體系。

 

      ①:在常用的QWidget體系中,設置前后位置是主要是用raise(),underStack(),hide()函數。

      理論為:在Qt中每個widget窗口都維持着自己的一個創建棧(widget's stack.),棧里邊存放的是該窗口所有子widget窗口的標識符(代表其各個子widget)。當創建一個子widget后,系統便會將將代表其的標識符壓入其父widget的創建棧中。而這各個子widget顯示的前后順序擇是:棧頂的在最上邊,棧底的最下邊。所以:后壓入棧的顯示在上邊,先入棧的在下邊。 由此可知:后創建的子widget會顯示出來!

那么:當我們創建了多個有重疊的子widget之后,最后創建的那個肯定是我們看到的那個。

       那如何改變這種先后順序呢?對於一個子widget,我們可以直接調用raise()函數來讓其升到棧頂,從而顯示在最上邊用戶面前,而不至於被遮擋;  當然我們也可以用underStack()來讓其處於某個子widget下邊,從而來指定前后順序。

 

      按照經驗來看,其實只要使用raise()函數就足夠了,需要顯示誰,就直接讓其調用raise()即可!!

 

      ②:對於QGraphicsWidget體系而言:

           其內部放的是各個item,對於他們而言:我們是直接可以用setZValue()來設置各個item之間的前后位置。

 

 

當然:還有一種混合情況,亦即:一個QGraphicsScene,其中既可以 用addItem()來加入item;也可以addWidget()來加入QWidget對象。 此時對於這種既有item,又有Qwidget的情況,該如何定義彼此之間的前后位置呢?

 

     其實當我們用addWidget()來想scene中加入QWidget時:該函數是有一個返回值的,為QGraphicsProxyWidget*類型指針。亦即:當我們調用addWidget()這個函數時,其一共做了兩步操作:

                                 一:系統首先把你原先的QWidget對象給轉換成“item對象”。

                                 二:而后再將這個轉換后生成的item放到scene場景中。

      但是其第一步操作中轉換生成的“item對象”和真正的item對象還是不一樣的,轉換生成的僅僅是真正item的一種代理形式!即:生成了一個QGraphicsProxyWidget類型的代理item !!  但是對於這個代理item,我們也可以用setZValue()來設置其前后位置啦!

 

      總結起來就是說:混合情況下,我們用addWidget()向一個scene場景中加入普通QWidget時,會返回一個QGraphicsProxyWidget*類型指針(其代表真正放入這個scene中的代理item),我們完全可以用它來調用setZValue()來設置前后位置,這樣其便和普通Item的前后位置設置方式相統一一致了!!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM