窗口的z-order是什么?PyQt5
窗口的z-order表明了在一堆堆疊的窗口中該窗口的位置。窗口的堆疊是沿著一條虛軸—Z軸,從屏幕里向外延伸的。在z-order頂端的窗口將會壓在其他窗口上。在z-order底部的窗口將會被其他窗口所壓。 系統在一個單一的表中維護z-order 。根據窗口是不是頂級窗口,父窗口,子窗口,系統把他們添加到z-order中。頂級窗口將會堆疊在所有非頂級窗口之上,不管它是否是活動窗口或者是前臺窗口。一個頂級窗口擁有WS_EX_TOPMOST的風格。在z-order中的所有的頂級窗口都會在任何非頂級窗口之前顯現。一個子窗口會歸入它父窗口的z-order中。 當一個應用程序創建一個窗口時,系統會把它放置在同一類窗口的z-order的頂部。你可以用 BringWindowToTop 函數將一個窗口置于同一類窗口的z-order的頂部。你可以通過 SetWindowPos和DeferWindowPos 函數重新排序z-order。 用戶可以通過激活一個不同的窗口來改變z-order?;顒拥拇翱跁幌到y放置在同類窗口的z-order的頂部。當一個窗口來到z-order的頂部,做自己的子窗口時。你可以用 GetTopWindow 函數去搜索父窗口的所有子窗口,并且返回一個指向z-order中最上邊的子窗口的句柄。 函數可以檢索句柄指向的下一個或前一個z-order中的窗口。
引用文章:z-order是什么
Z-order,也有人稱為 Zorder,指的是對象之間的層次關系。舉個簡單的例子:在使用 PowERP oint 制作文件時,當你把文件上被其它對象蓋住的某個對象「上推至最頂層」,你就是在改變它的 Z-order。通常 Z-order 高者置于 Z-order 低者的「上面」。
通常 GUI 程序設計都會用到 Z-order 的觀念,所以 Borland OWL 有 Z-order,Java AWT 有 Z-order,Java Swing 也有 Z-order。這些 GUI 鏈接庫都提供了良好的 Z-order 自動管理機制,貼心地幫我們管理 Z-order,大部分的情況之下,我們不會直接使用到 Z-order。但是,當你需要處理到對象之間的層次關系時,如果你不知道 Z-order,你可就麻煩了。我曾經用 Java 設計過一個簡單的 UML 繪圖軟件,當時并未善加使用 Swing 的 Z-order 管理機制(即 JLayeredPane),結果多寫了好些程序代碼就只是為了控制層次關系。這篇文章簡單地為您介紹 Java 的 Z-order 觀念以及 JLayeredPane,希望你不要重蹈我的覆轍。
許多 Swing 的書都會再三告誡讀者,「盡量不要」混合使用 Swing 和 AWT 的組件,原因就在于 Swing 和 AWT 的 Z-order 系統是不一樣的。Swing 組件大都是 lightweight 的,而 AWT 的組件則一律是 heavyweight 的。我有個不錯的比喻:Swing 組件是在 AWT 組件之內徑自切割出來的層次,就好比 green thread 是在 process 之內徑自切割出來的排程單位。你可能會問:「現在 green thread 已經「進化」成 native thread 了,以后 Swing 的 Z-order 會不會也「進化」成和 AWT 的 Z-order 同地位?」我認為不會,因為如果這樣做的話,Swing 組件都必須繼承自 AWT 組件,而目前 Swing 正致力于減少 CPU 和內存資源的消耗量來提升速度,所以不可能還走回頭路 heavyweight 化。
AWT 和 Swing 的 Z-order 規則一樣,如下:
但是如果混合使用 AWT 和 Swing,上述第二條規則就不一定了。比方說,在某容器內先加入一個 Swing 的組件,再加入一個 AWT 的組件,且此二組件有重疊的區域,結果卻是 AWT 組件出現在 Swing 組件上面。這并未遵守第二條的規定,因為此例同時使用了 AWT 和 Swing,Swing 組件被當成和容器同一個層,AWT 組件則是容器上一層。
在六個標準的 layout(包括 BorderLayout、FlowLayout、GridLayout、GridBagLayout、CardLayout、以及 BoxLayout)管理之下,容器的組件之間不會重疊(甚至連 CardLayout 管理之下也是如此,因為 CardLayout 只是邏輯上組件重疊,但實際上的做法是一次只有一個組件被設為 visible),所以大多數情況下 Z-order 并不會影響外觀。但是當組件之間有重疊的情況發生時,你就要特別注意了,這些包括了:
˙ 將 layout 設為 null,由程序自行控制組件的 layout,而且允許組件重疊的話,你不可以同時使用 AWT 和 Swing 的組件。
˙ JInternalFrame、JScrollPane、JLayeredPane、JDesktopPane… 等容器會以重疊的方式放置組件,你不可以同時使用 AWT 和 Swing 的組件。
˙ 當使用 pop-up menu 時,此 menu 的容器如果有 heavyweight 的組件,那么你必須讓此 pop-up menu 為 heavyweight,否則此 pop-up menu 可能會被蓋住。呼叫 JPopupMenu.setLightWeightPopupEnabled(false) 即可讓以后產生的 pop-up menu 都是 heavyweight 形式的。
前面提到,越早加入某容器的組件,其 Z-order 越高。除了 remove 再 add 之外,想改變 Z-order,你別無它法。但是如果你真的需要改變某容器的組件之 Z-order,那么你可以改用 javax.swing.JLayeredPane 當作容器,因為 JLayeredPane 提供了許多讓你可以改變組件 Z-order 的 method。
對于 JLayeredPane 來說,Z-order 由兩部分組成,分別是 layer 和 position,兩者都是整數值。某組件的 layer 數目越高,表示位于越上層。如果兩個組件位于同一個 layer,則 position 數目越低者位于越上層。關于 JLayeredPane,請看 O’Reilly 出版的「Java Swing」一書 223~231 頁。
引用文章:探究 Z-Order
總結
以上是生活随笔為你收集整理的窗口的z-order是什么?PyQt5的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python PyQt5.QtWidge
- 下一篇: pycharm报黄提示(黄色高亮警告):