Qt繪圖:Window and Dialog Widgets
概述
如果一個Widget沒有嵌入到另一個Widget(父)中,那麼這個widget就被成為是一個Window(窗口)。通常一個window包括一個frame(框架),一個title bar(標題欄)。這裡的frame、title bar都是屬於裝飾性部件。通過設置 window flags 可以隱藏掉這些「裝飾品」,比如隱藏掉窗口上的關閉、最大化、最小化按鈕。
在Qt中,QMainWindow 和 QDialog 是最常見的兩個window type(窗口類型)。在應用程序中,window提供了構建用戶交互界面用的screen space(屏幕空間)。Windows將這些裝飾獨立開來,這樣方便我們對每一部分進行自定義操作。Windows集成在了桌面環境中,並在某種程度上由 winodw management system(窗口管理系統)進行管理。例如,選擇某個應用程序上的窗口將在task bar(任務欄)中表示。

Primary(主) and Secondary(輔) Windows
沒有父對象的QWidget都將成為一個window,並且在桌面的 task bar上顯示。一般我們只需要一個主窗口,即Primary window。另外,擁有父對象的QWidget都可以通過設置Qt::Window flag 來成為一個window。這種QWidget通常堆放在父對象的頂部,不在系統的任務欄上顯示。
QMainWindow類在構造函數中就已經默認設置了Qt::Window flag,因為它被設計用來表示一個窗口並提供了很多的功能,這些功能並不是為子widget準備的。

Main Windows and Dialogs
Application Main Window(應用程序主窗口)提供了構建整個用戶界面的框架,通過子類化QMainWindow創建。QMainWindow有自己的layout(布局),你可以添加menu bar(菜單欄)、tool bar(工具欄)、dockable widgets(懸浮小部件)、status bar(狀態欄)。中心區域可以放置任何的QWidget。

Dialog Windows(對話框)作為輔助窗口用來給用戶提供選項等信息。對話框是通過子類化QDialog以及自己添加widgets和布局來創建的。另外,Qt提供了一些標準的對話框用於文件、字體選擇等。

無論是MainWindow還是Dialog都可以用Qt Designer設計。可視化的創建設計以及閱讀由uic生成的代碼是學習Qt的好方法!

Window Geometry(窗口幾何)
QWidget提供了很多的函數來操作一個widget的幾何尺寸。有些函數作用在除了window frame之外的區域,有些則直接作用在window frame上。
- Including window frame(包含frame):x(), y(), frameGeometry(), pos(), move().
- Excludin window frame(未包含frame):geometry(), width(), height(), rect(), size().
注意其中的區別,上面的函數返回的只是top-level widget(頂級widget)的幾何尺寸。對於頂級widget中的子widget,frame geometry(框架尺寸)= widget本身的平面尺寸。如下圖所示:

X11特點
在X11上(一般就是指的Linux系統),window(即窗口類型的widget)是沒有frame的,初始化的時候是window manager(窗口管理器)對其進行各種各樣的裝飾。Linux系統自帶的窗口管理器是在調用QWidget::show()或者第一次調用paint event(繪圖事件)之後的某個時間點上非同步發生的,或者根本就不會發生。請記住,X11的policy(策略)原則是自由靈活。這樣的話你是不能對你的window將會獲得何種裝飾進行安全假設。總是有一個window manager(窗口管理器)打破你的假設。
此外,tooltik(工具包)不能簡單的把窗口放到屏幕上。Qt所能做的是發送certain hint(提示)給window manager(窗口管理器)。窗口管理器是有獨立進程的,它對Qt所發送的提示可能忽略、服從甚至曲解含義。由於Inter-Client Communication Conventions Manual (ICCCM)(客戶端之間通信約定手冊)中有些部分規定的不明確,現有的窗口管理器中的窗口位置處理方式差別很大。
一旦window被修飾後,X11不會提供標準或方便的方式獲取frame geometry(框架幾何尺寸)。Qt是通過巧妙地方法來解決這種問題的,這種方法適用於今天很多的窗口管理器。當你遇到QWidget::frameGeometry()的返回錯誤時不要驚訝。
X11也不提供最大化窗口的方法,卻可以用QWidget::showMaximized()模擬這種特性。其結果取決於QWidget::frameGeometry()和窗口管理器,這兩種都是無法保證的。
推薦閱讀:
TAG:QtC開發框架 |
