?? geometry.html
字號:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- /home/reggie/tmp/qt-3.0-reggie-5401/qt-win-commercial-3.0.5/doc/misc.doc:1187 -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta name="Translator" content="Cavendish">
<meta name="Qt zh_CN Documents Website" content="http://www.qiliang.net/qt">
<title>窗口幾何結構</title>
<style type="text/css"><!--
h3.fn,span.fn { margin-left: 1cm; text-indent: -1cm; }
a:link { color: #004faf; text-decoration: none }
a:visited { color: #672967; text-decoration: none }
body { background: #ffffff; color: black; font-family: "Times New Roman" }
--></style>
</head>
<body>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tr bgcolor="#E5E5E5">
<td valign=center>
<a href="index.html">
<font color="#004faf">主頁</font></a>
| <a href="classes.html">
<font color="#004faf">所有的類</font></a>
| <a href="mainclasses.html">
<font color="#004faf">主要的類</font></a>
| <a href="annotated.html">
<font color="#004faf">注釋的類</font></a>
| <a href="groups.html">
<font color="#004faf">分組的類</font></a>
| <a href="functions.html">
<font color="#004faf">函數</font></a>
</td>
<td align="right" valign="center"><img src="logo32.png" align="right" width="64" height="32" border="0"></td></tr></table>
<h1 align=center>窗口幾何結構</h1>
<h2> 概述
</h2>
<a name="1"></a><p> <a href="qwidget.html">QWidget</a>提供了幾個處理窗口幾何結構的函數。這些函數中的幾個操作純客戶區域(例如不包含窗口框架的窗口),其它一些包括窗口框架。它們之間的區別在某種意義上被完成覆蓋明顯地最普通的方法。
<p> <dl>
<dt><strong>包括窗口的框架:</strong>
<dd>x(), y(), frameGeometry(), pos() and move()
<dt><strong>不包括窗口的框架:</strong>
<dd> geometry(), width(), height(), rect() and size()
</dl>
<p> 請注意這這種區別僅僅對于被裝飾的頂層窗口部件有效。對于所有的子窗口部件,框架的幾何結構和這個窗口部件的客戶幾何結構相同。
<p> 這個圖顯示了我們所使用的絕大多數函數:
<center><img src="geometry.png" alt="Geometry diagram"></center>
<p> <h2> Unix/X11特性
</h2>
<a name="2"></a><p> 在Unix/X11中,一個窗口沒有框架直到窗口管理器來裝飾它。這種情況發生在異步情況下調用show()之后和窗口接收到第一個繪畫事件的一些點中,否則它根本就不會發生。請記住X11是自由策略的(其它人把它稱為靈活的)。因此你不能作出關于你的窗口得到裝飾框架這樣的任何安全假設。基本規則:總是會有用戶使用窗口管理器來打破你的假設,并且他還會向你抱怨。
<p> 此外,一個工具包不能簡單地把窗口放置到屏幕上。Qt所能做的一切是把一些確定的提示發送給窗口管理器。窗口管理器,一個單獨的進程,也許會遵守、忽略或者誤解它們。由于部分不清楚的客戶間通信約定(ICCCM),在存在的窗口管理器中窗口放置的處理非常困難。
<p> 當窗口被裝飾的時候,X11沒有提供標準的或者容易的方式來獲得框架的幾何結構。Qt使用了可以工作在今天存在的大量的窗口管理器中的非常富有啟發性和巧妙的代碼來解決這一問題。如果你發現某種情況下frameGeometry()返回了虛假的結果的時候,請不要驚訝。
<p> X11同樣也不提供最大化一個窗口的方法。因此Qt中的showMaximized()函數不得不模擬這一功能。它的結果完全取決于frameGeometry()的結果和窗口管理器作出正確的窗口放置的能力,但這兩個都不能被保證。
<p> <h2> 恢復窗口幾何結構
</h2>
<a name="3"></a><p> 現代的應用程序的一個普通任務就是在稍后的對話中恢復一個窗口的幾何結構。在Windows中,這基本上通過存儲geometry()的結果和在下一個對話中還沒有框架之前調用setGeometry()。在X11中,這樣將不會工作,因為一個沒有顯示的窗口還沒有框架呢。窗口管理器將會在稍后裝飾這個窗口。當這些發生的時候,窗口朝著依賴于裝飾框架的大小的屏幕的右下角偏移。X從理論上提供了一種可以避免這種偏移的方法。盡管,我們的測試已經顯示,絕大多數窗口管理器都不能實現這一特性。
<p> 一個工作區在show()之后調用setGeometry()。這樣做有兩個缺點,是窗口部件會在一毫秒中出現在一個錯誤的位置(結果是閃爍)和通常在一秒之后窗口管理器會正確地得到它。一個安全的方式是存儲pos()和size()并且在show()之前調用resize()和move()來恢復幾何結構,就像下面這個例子一樣裝飾:
<p> <pre>
MyWidget* widget = new MyWidget
...
<a href="qpoint.html">QPoint</a> p = widget->pos(); // 存儲位置
<a href="qsize.html">QSize</a> s = widget->size(); // 存儲大小
...
widget = new MyWidget;
widget->resize( s ); // 恢復大小
widget->move( p ); // 恢復位置
widget->show(); // 顯示窗口部件
</pre>
<p> 這種方法可以在MS-Windows和絕大多數現存的X11窗口管理器上工作。
<p>
<!-- eof -->
<p><address><hr><div align=center>
<table width=100% cellspacing=0 border=0><tr>
<td>Copyright © 2002
<a href="http://www.trolltech.com">Trolltech</a>
<td><a href="http://www.trolltech.com/trademarks.html">Trademarks</a>
<td><a href="zh_CN.html">譯者:Cavendish</a>
<td align=right><div align=right>Qt 3.0.5版</div>
</table></div></address></body>
</html>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -