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 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175
|
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en_US" lang="en_US">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<!-- sipdialog.qdoc -->
<title>Qt 4.8: SIP Dialog Example</title>
<link rel="stylesheet" type="text/css" href="style/offline.css" />
</head>
<body>
<div class="header" id="qtdocheader">
<div class="content">
<a href="index.html" class="qtref"><span>Qt Reference Documentation</span></a>
</div>
<div class="breadcrumb toolblock">
<ul>
<li class="first"><a href="index.html">Home</a></li>
<!-- Breadcrumbs go here -->
<li><a href="all-examples.html">Examples</a></li>
<li>SIP Dialog Example</li>
</ul>
</div>
</div>
<div class="content mainContent">
<div class="toc">
<h3><a name="toc">Contents</a></h3>
<ul>
<li class="level1"><a href="#dialog-class-definition">Dialog Class Definition</a></li>
<li class="level1"><a href="#dialog-class-implementation">Dialog Class Implementation</a></li>
<li class="level1"><a href="#the-function">The <tt>main()</tt> function</a></li>
</ul>
</div>
<h1 class="title">SIP Dialog Example</h1>
<span class="subtitle"></span>
<!-- $$$dialogs/sipdialog-description -->
<div class="descr"> <a name="details"></a>
<p>Files:</p>
<ul>
<li><a href="dialogs-sipdialog-dialog-cpp.html">dialogs/sipdialog/dialog.cpp</a></li>
<li><a href="dialogs-sipdialog-dialog-h.html">dialogs/sipdialog/dialog.h</a></li>
<li><a href="dialogs-sipdialog-main-cpp.html">dialogs/sipdialog/main.cpp</a></li>
<li><a href="dialogs-sipdialog-sipdialog-pro.html">dialogs/sipdialog/sipdialog.pro</a></li>
</ul>
<p>The SIP Dialog example shows how to create a dialog that is aware of the Windows Mobile SIP (Software Input Panel) and reacts to it.<table class="generic">
<tr valign="top" class="odd"><td ><img src="images/sipdialog-closed.png" alt="" /></td><td ><img src="images/sipdialog-opened.png" alt="" /></td></tr>
</table>
<p>Sometimes it is necessary for a dialog to take the SIP into account, as the SIP may hide important input widgets. The SIP Dialog Example shows how a <tt>Dialog</tt> object, <tt>dialog</tt>, can be resized accordingly if the SIP is opened, by embedding the contents of <tt>dialog</tt> in a <a href="qscrollarea.html">QScrollArea</a>.</p>
<a name="dialog-class-definition"></a>
<h2>Dialog Class Definition</h2>
<p>The <tt>Dialog</tt> class is a subclass of <a href="qdialog.html">QDialog</a> that implements a public slot, <tt>desktopResized()</tt>, and a public function, <tt>reactToSIP()</tt>. Also, it holds a private instance of <a href="qrect.html">QRect</a>, <tt>desktopGeometry</tt>.</p>
<pre class="cpp"> <span class="keyword">class</span> Dialog : <span class="keyword">public</span> <span class="type"><a href="qdialog.html">QDialog</a></span>
{
Q_OBJECT
<span class="keyword">public</span>:
Dialog();
<span class="type">void</span> reactToSIP();
<span class="keyword">private</span>:
<span class="type"><a href="qrect.html">QRect</a></span> desktopGeometry;
<span class="keyword">public</span> <span class="keyword">slots</span>:
<span class="type">void</span> desktopResized(<span class="type">int</span> screen);
};</pre>
<a name="dialog-class-implementation"></a>
<h2>Dialog Class Implementation</h2>
<p>In the constructor of <tt>Dialog</tt>, we start by obtaining the available geometry of the screen with <a href="qdesktopwidget.html#availableGeometry">availableGeometry()</a>. The parameter used is <tt>0</tt> to indicate that we require the primary screen.</p>
<pre class="cpp"> Dialog<span class="operator">::</span>Dialog()
{
desktopGeometry <span class="operator">=</span> <span class="type"><a href="qapplication.html">QApplication</a></span><span class="operator">::</span>desktop()<span class="operator">-</span><span class="operator">></span>availableGeometry(<span class="number">0</span>);
setWindowTitle(tr(<span class="string">"SIP Dialog Example"</span>));
<span class="type"><a href="qscrollarea.html">QScrollArea</a></span> <span class="operator">*</span>scrollArea <span class="operator">=</span> <span class="keyword">new</span> <span class="type"><a href="qscrollarea.html">QScrollArea</a></span>(<span class="keyword">this</span>);
<span class="type"><a href="qgroupbox.html">QGroupBox</a></span> <span class="operator">*</span>groupBox <span class="operator">=</span> <span class="keyword">new</span> <span class="type"><a href="qgroupbox.html">QGroupBox</a></span>(scrollArea);
groupBox<span class="operator">-</span><span class="operator">></span>setTitle(tr(<span class="string">"SIP Dialog Example"</span>));
<span class="type"><a href="qgridlayout.html">QGridLayout</a></span> <span class="operator">*</span>gridLayout <span class="operator">=</span> <span class="keyword">new</span> <span class="type"><a href="qgridlayout.html">QGridLayout</a></span>(groupBox);
groupBox<span class="operator">-</span><span class="operator">></span>setLayout(gridLayout);</pre>
<p>We set the window's title to "SIP Dialog Example" and declare a <a href="qscrollarea.html">QScrollArea</a> object, <tt>scrollArea</tt>. Next we instantiate a <a href="qgroupbox.html">QGroupBox</a>, <tt>groupBox</tt>, with <tt>scrollArea</tt> as its parent. The title of <tt>groupBox</tt> is also set to "SIP Dialog Example". A <a href="qgridlayout.html">QGridLayout</a> object, <tt>gridLayout</tt>, is then used as <tt>groupBox</tt>'s layout.</p>
<p>We create a <a href="qlineedit.html">QLineEdit</a>, a <a href="qlabel.html">QLabel</a> and a <a href="qpushbutton.html">QPushButton</a> and we set the <a href="qwidget.html#minimumWidth-prop">minimumWidth</a> property to 220 pixels, respectively.</p>
<pre class="cpp"> <span class="type"><a href="qlineedit.html">QLineEdit</a></span><span class="operator">*</span> lineEdit <span class="operator">=</span> <span class="keyword">new</span> <span class="type"><a href="qlineedit.html">QLineEdit</a></span>(groupBox);
lineEdit<span class="operator">-</span><span class="operator">></span>setText(tr(<span class="string">"Open and close the SIP"</span>));
lineEdit<span class="operator">-</span><span class="operator">></span>setMinimumWidth(<span class="number">220</span>);
<span class="type"><a href="qlabel.html">QLabel</a></span><span class="operator">*</span> label <span class="operator">=</span> <span class="keyword">new</span> <span class="type"><a href="qlabel.html">QLabel</a></span>(groupBox);
label<span class="operator">-</span><span class="operator">></span>setText(tr(<span class="string">"This dialog resizes if the SIP is opened"</span>));
label<span class="operator">-</span><span class="operator">></span>setMinimumWidth(<span class="number">220</span>);
<span class="type"><a href="qpushbutton.html">QPushButton</a></span><span class="operator">*</span> button <span class="operator">=</span> <span class="keyword">new</span> <span class="type"><a href="qpushbutton.html">QPushButton</a></span>(groupBox);
button<span class="operator">-</span><span class="operator">></span>setText(tr(<span class="string">"Close Dialog"</span>));
button<span class="operator">-</span><span class="operator">></span>setMinimumWidth(<span class="number">220</span>);</pre>
<p>Also, all three widgets' text are set accordingly. The <a href="qgridlayout.html#verticalSpacing-prop">verticalSpacing</a> property of <tt>gridLayout</tt> is set based on the height of <tt>desktopGeometry</tt>. This is to adapt to the different form factors of Windows Mobile. Then, we add our widgets to the layout.</p>
<pre class="cpp"> <span class="keyword">if</span> (desktopGeometry<span class="operator">.</span>height() <span class="operator"><</span> <span class="number">400</span>)
gridLayout<span class="operator">-</span><span class="operator">></span>setVerticalSpacing(<span class="number">80</span>);
<span class="keyword">else</span>
gridLayout<span class="operator">-</span><span class="operator">></span>setVerticalSpacing(<span class="number">150</span>);
gridLayout<span class="operator">-</span><span class="operator">></span>addWidget(label);
gridLayout<span class="operator">-</span><span class="operator">></span>addWidget(lineEdit);
gridLayout<span class="operator">-</span><span class="operator">></span>addWidget(button);</pre>
<p>The <tt>scrollArea</tt>'s widget is set to <tt>groupBox</tt>. We use a <a href="qhboxlayout.html">QHBoxLayout</a> object, <tt>layout</tt>, to contain <tt>scrollArea</tt>. The <tt>Dialog</tt>'s layout is set to <tt>layout</tt> and the scroll area's horizontal scroll bar is turned off.</p>
<pre class="cpp"> scrollArea<span class="operator">-</span><span class="operator">></span>setWidget(groupBox);
<span class="type"><a href="qhboxlayout.html">QHBoxLayout</a></span><span class="operator">*</span> layout <span class="operator">=</span> <span class="keyword">new</span> <span class="type"><a href="qhboxlayout.html">QHBoxLayout</a></span>();
layout<span class="operator">-</span><span class="operator">></span>addWidget(scrollArea);
setLayout(layout);
scrollArea<span class="operator">-</span><span class="operator">></span>setHorizontalScrollBarPolicy(<span class="type"><a href="qt.html">Qt</a></span><span class="operator">::</span>ScrollBarAlwaysOff);</pre>
<p>The following signals are connected to their respective slots:</p>
<ul>
<li><tt>button</tt>'s <a href="qabstractbutton.html#pressed">pressed()</a> signal to <a href="qapplication.html">QApplication</a>'s <a href="qapplication.html#closeAllWindows">closeAllWindows()</a> slot,</li>
<li><a href="qdesktopwidget.html">QDesktopWidget</a>'s <a href="qdesktopwidget.html#workAreaResized">workAreaResized()</a> signal to <tt>dialog</tt>'s <tt>desktopResized()</tt> slot.</li>
</ul>
<pre class="cpp"> connect(button<span class="operator">,</span> SIGNAL(clicked())<span class="operator">,</span>
qApp<span class="operator">,</span> SLOT(closeAllWindows()));
connect(<span class="type"><a href="qapplication.html">QApplication</a></span><span class="operator">::</span>desktop()<span class="operator">,</span> SIGNAL(workAreaResized(<span class="type">int</span>))<span class="operator">,</span>
<span class="keyword">this</span><span class="operator">,</span> SLOT(desktopResized(<span class="type">int</span>)));
}</pre>
<p>The <tt>desktopResized()</tt> function accepts an integer, <i>screen</i>, corresponding to the screen's index. We only invoke <tt>reactToSIP()</tt> if <i>screen</i> is the primary screen (e.g. index = 0).</p>
<pre class="cpp"> <span class="type">void</span> Dialog<span class="operator">::</span>desktopResized(<span class="type">int</span> screen)
{
<span class="keyword">if</span> (screen <span class="operator">!</span><span class="operator">=</span> <span class="number">0</span>)
<span class="keyword">return</span>;
reactToSIP();
}</pre>
<p>The <tt>reactToSIP()</tt> function resizes <tt>dialog</tt> accordingly if the desktop's available geometry changed vertically, as this change signifies that the SIP may have been opened or closed.</p>
<pre class="cpp"> <span class="type">void</span> Dialog<span class="operator">::</span>reactToSIP()
{
<span class="type"><a href="qrect.html">QRect</a></span> availableGeometry <span class="operator">=</span> <span class="type"><a href="qapplication.html">QApplication</a></span><span class="operator">::</span>desktop()<span class="operator">-</span><span class="operator">></span>availableGeometry(<span class="number">0</span>);
<span class="keyword">if</span> (desktopGeometry <span class="operator">!</span><span class="operator">=</span> availableGeometry) {
<span class="keyword">if</span> (windowState() <span class="operator">|</span> <span class="type"><a href="qt.html">Qt</a></span><span class="operator">::</span>WindowMaximized)
setWindowState(windowState() <span class="operator">&</span> <span class="operator">~</span><span class="type"><a href="qt.html">Qt</a></span><span class="operator">::</span>WindowMaximized);
setGeometry(availableGeometry);
}
desktopGeometry <span class="operator">=</span> availableGeometry;
}</pre>
<p>If the height has decreased, we unset the maximized window state. Otherwise, we set the maximized window state. Lastly, we update <tt>desktopGeometry</tt> to the desktop's available geometry.</p>
<a name="the-function"></a>
<h2>The <tt>main()</tt> function</h2>
<p>The <tt>main()</tt> function for the SIP Dialog example instantiates <tt>Dialog</tt> and invokes its <a href="qdialog.html#exec">exec()</a> function.</p>
<pre class="cpp"> <span class="type">int</span> main(<span class="type">int</span> argc<span class="operator">,</span> <span class="type">char</span> <span class="operator">*</span>argv<span class="operator">[</span><span class="operator">]</span>)
{
<span class="type"><a href="qapplication.html">QApplication</a></span> app(argc<span class="operator">,</span> argv);
Dialog dialog;
<span class="keyword">return</span> dialog<span class="operator">.</span>exec();
}</pre>
<p><b>Note:</b> Although this example uses a dialog, the techniques used here apply to all top-level widgets respectively.</p>
</div>
<!-- @@@dialogs/sipdialog -->
<div class="ft">
<span></span>
</div>
</div>
<div class="footer">
<p>
<acronym title="Copyright">©</acronym> 2012 Nokia Corporation and/or its
subsidiaries. Documentation contributions included herein are the copyrights of
their respective owners.</p>
<br />
<p>
The documentation provided herein is licensed under the terms of the
<a href="http://www.gnu.org/licenses/fdl.html">GNU Free Documentation
License version 1.3</a> as published by the Free Software Foundation.</p>
<p>
Documentation sources may be obtained from <a href="http://www.qt-project.org">
www.qt-project.org</a>.</p>
<br />
<p>
Nokia, Qt and their respective logos are trademarks of Nokia Corporation
in Finland and/or other countries worldwide. All other trademarks are property
of their respective owners. <a title="Privacy Policy"
href="http://en.gitorious.org/privacy_policy/">Privacy Policy</a></p>
</div>
</body>
</html>
|