summaryrefslogtreecommitdiffstats
path: root/doc/html/geometry.html
blob: 6b86e562f45c64fb08fc1b27de3341e23bd3763e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- /home/espenr/tmp/qt-3.3.8-espenr-2499/qt-x11-free-3.3.8/doc/misc.doc:1031 -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Window Geometry</title>
<style type="text/css"><!--
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; }
--></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">Home</font></a>
 | <a href="classes.html">
<font color="#004faf">All&nbsp;Classes</font></a>
 | <a href="mainclasses.html">
<font color="#004faf">Main&nbsp;Classes</font></a>
 | <a href="annotated.html">
<font color="#004faf">Annotated</font></a>
 | <a href="groups.html">
<font color="#004faf">Grouped&nbsp;Classes</font></a>
 | <a href="functions.html">
<font color="#004faf">Functions</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>Window Geometry</h1>

 
<h2> Overview
</h2>
<a name="1"></a><p> <a href="qwidget.html">QWidget</a> provides several functions that deal with a widget's
geometry.  Some of these functions operate on the pure client area
(i.e. the window excluding the window frame), others include the
window frame. The differentiation is done in a way that covers the
most common usage transparently.
<p> <center><table cellpadding="4" cellspacing="2" border="0">
<tr bgcolor="#f0f0f0">
<td valign="top"><strong>Including the window frame:
<td valign="top">x(), y(), frameGeometry(), pos() and move()
<tr bgcolor="#d0d0d0">
<td valign="top"><strong>Excluding the window frame:</strong>
<td valign="top">geometry(), width(), height(), rect() and size()
</table></center>
<p> Note that the distinction only matters for decorated top-level
widgets. For all child widgets, the frame geometry is equal to the
widget's client geometry.
<p> This diagram shows most of the functions in use:
<center><img src="geometry.png" alt="Geometry diagram"></center> 
<p> <h2> Unix/X11 peculiarities
</h2>
<a name="2"></a><p> On Unix/X11, a window does not have a frame until the window manager
decorates it. This happens asynchronously at some point in time after
calling show() and the first paint event the window receives: or it
does not happen at all. Bear in mind that X11 is policy-free (others
call it flexible). Thus you cannot make any safe assumption about the
decoration frame your window will get. Basic rule: there's always one
user who uses a window manager that breaks your assumption, and who
will complain to you.
<p> Furthermore, a toolkit cannot simply place windows on the screen. All
Qt can do is to send certain hints to the window manager. The window
manager, a separate process, may either obey, ignore or misunderstand
them. Due to the partially unclear Inter-Client Communication
Conventions Manual (ICCCM), window placement is handled quite
differently in existing window managers.
<p> X11 provides no standard or easy way to get the frame geometry once
the window is decorated. Qt solves this problem with nifty heuristics
and clever code that works on a wide range of window managers that
exist today. Don't be surprised if you find one where frameGeometry()
returns bogus results though.
<p> Nor does X11 provide a way to maximize a window. The showMaximized()
function in Qt therefore has to emulate the feature. Its result
depends on the result of frameGeometry() and the capability of the
window manager to do proper window placement, neither of which can be
guaranteed.
<p> <h2> Restoring a Window's Geometry
</h2>
<a name="3"></a><p> A common task in modern applications is to restore a window's geometry
in a later session. On Windows, this is basically storing the result
of geometry() and calling setGeometry() in the next session before
calling show(). On X11, this won't work because an invisible window
doesn't have a frame yet. The window manager would decorate the window
later. When this happens, the window shifts towards the bottom/right
corner of the screen depending on the size of the decoration frame. X
theoretically provides a way to avoid this shift. Our tests have
shown, though, that almost all window managers fail to implement this
feature.
<p> A workaround is to call setGeometry() after show(). This has the
two disadvantages that the widget appears at a wrong place for a
millisecond (results in flashing) and that currently only every
second window manager gets it right. A safer solution is to store
both pos() and size() and to restore the geometry using resize() and
move() before calling show(), as demonstrated in the following
example:
<p> <pre>
    MyWidget* widget = new MyWidget
    ...
    <a href="qpoint.html">QPoint</a> p = widget-&gt;pos();   // store position
    <a href="qsize.html">QSize</a> s = widget-&gt;size();   // store size
    ...
    widget = new MyWidget;
    widget-&gt;resize( s );        // restore size
    widget-&gt;move( p );          // restore position
    widget-&gt;show();             // show widget
</pre>
 
<p> This method works on both MS-Windows and most existing X11 window
managers.
<p> 
<!-- eof -->
<p><address><hr><div align=center>
<table width=100% cellspacing=0 border=0><tr>
<td>Copyright &copy; 2007
<a href="troll.html">Trolltech</a><td align=center><a href="trademarks.html">Trademarks</a>
<td align=right><div align=right>Qt 3.3.8</div>
</table></div></address></body>
</html>