這兩天在總結一些以往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的前后位置設置方式相統一一致了!!