Sophie

Sophie

distrib > Mageia > 7 > i586 > by-pkgid > 1dd17e0d683ef79b4bb6872bbf359d7f > files > 1510

qt4-doc-4.8.7-26.2.mga7.noarch.rpm

<?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" />
<!-- screenshot.qdoc -->
  <title>Qt 4.8: Screenshot Example</title>
  <link rel="stylesheet" type="text/css" href="style/style.css" />
  <script src="scripts/jquery.js" type="text/javascript"></script>
  <script src="scripts/functions.js" type="text/javascript"></script>
  <link rel="stylesheet" type="text/css" href="style/superfish.css" />
  <link rel="stylesheet" type="text/css" href="style/narrow.css" />
  <!--[if IE]>
<meta name="MSSmartTagsPreventParsing" content="true">
<meta http-equiv="imagetoolbar" content="no">
<![endif]-->
<!--[if lt IE 7]>
<link rel="stylesheet" type="text/css" href="style/style_ie6.css">
<![endif]-->
<!--[if IE 7]>
<link rel="stylesheet" type="text/css" href="style/style_ie7.css">
<![endif]-->
<!--[if IE 8]>
<link rel="stylesheet" type="text/css" href="style/style_ie8.css">
<![endif]-->

<script src="scripts/superfish.js" type="text/javascript"></script>
<script src="scripts/narrow.js" type="text/javascript"></script>

</head>
<body class="" onload="CheckEmptyAndLoadList();">
 <div class="header" id="qtdocheader">
    <div class="content"> 
    <div id="nav-logo">
      <a href="index.html">Home</a></div>
    <a href="index.html" class="qtref"><span>Qt Reference Documentation</span></a>
    <div id="narrowsearch"></div>
    <div id="nav-topright">
      <ul>
        <li class="nav-topright-home"><a href="http://qt.digia.com/">Qt HOME</a></li>
        <li class="nav-topright-dev"><a href="http://qt-project.org/">DEV</a></li>
        <li class="nav-topright-doc nav-topright-doc-active"><a href="http://qt-project.org/doc/">
          DOC</a></li>
        <li class="nav-topright-blog"><a href="http://blog.qt.digia.com/">BLOG</a></li>
      </ul>
    </div>
    <div id="shortCut">
      <ul>
        <li class="shortCut-topleft-inactive"><span><a href="index.html">Qt 4.8</a></span></li>
        <li class="shortCut-topleft-active"><a href="http://qt-project.org/doc/">ALL VERSIONS        </a></li>
      </ul>
     </div>
 <ul class="sf-menu" id="narrowmenu"> 
             <li><a href="#">API Lookup</a> 
                 <ul> 
                     <li><a href="classes.html">Class index</a></li> 
           <li><a href="functions.html">Function index</a></li> 
           <li><a href="modules.html">Modules</a></li> 
           <li><a href="namespaces.html">Namespaces</a></li> 
           <li><a href="qtglobal.html">Global Declarations</a></li> 
           <li><a href="qdeclarativeelements.html">QML elements</a></li> 
             </ul> 
             </li> 
             <li><a href="#">Qt Topics</a> 
                 <ul> 
                        <li><a href="qt-basic-concepts.html">Programming with Qt</a></li>  
                        <li><a href="qtquick.html">Device UIs &amp; Qt Quick</a></li>  
                        <li><a href="qt-gui-concepts.html">UI Design with Qt</a></li>  
                        <li><a href="supported-platforms.html">Supported Platforms</a></li>  
                        <li><a href="technology-apis.html">Qt and Key Technologies</a></li>  
                        <li><a href="best-practices.html">How-To's and Best Practices</a></li>  
              </ul> 
                 </li> 
                 <li><a href="#">Examples</a> 
                     <ul> 
                       <li><a href="all-examples.html">Examples</a></li> 
                       <li><a href="tutorials.html">Tutorials</a></li> 
                       <li><a href="demos.html">Demos</a></li> 
                       <li><a href="qdeclarativeexamples.html">QML Examples</a></li> 
                </ul> 
                     </li> 
                 </ul> 
    </div>
  </div>
  <div class="wrapper">
    <div class="hd">
      <span></span>
    </div>
    <div class="bd group">
      <div class="sidebar">
        <div class="searchlabel">
          Search index:</div>
        <div class="search" id="sidebarsearch">
          <form id="qtdocsearch" action="" onsubmit="return false;">
            <fieldset>
              <input type="text" name="searchstring" id="pageType" value="" />
 <div id="resultdialog"> 
 <a href="#" id="resultclose">Close</a> 
 <p id="resultlinks" class="all"><a href="#" id="showallresults">All</a> | <a href="#" id="showapiresults">API</a> | <a href="#" id="showarticleresults">Articles</a> | <a href="#" id="showexampleresults">Examples</a></p> 
 <p id="searchcount" class="all"><span id="resultcount"></span><span id="apicount"></span><span id="articlecount"></span><span id="examplecount"></span>&nbsp;results:</p> 
 <ul id="resultlist" class="all"> 
 </ul> 
 </div> 
            </fieldset>
          </form>
        </div>
        <div class="box first bottombar" id="lookup">
          <h2 title="API Lookup"><span></span>
            API Lookup</h2>
          <div  id="list001" class="list">
          <ul id="ul001" >
              <li class="defaultLink"><a href="classes.html">Class index</a></li>
              <li class="defaultLink"><a href="functions.html">Function index</a></li>
              <li class="defaultLink"><a href="modules.html">Modules</a></li>
              <li class="defaultLink"><a href="namespaces.html">Namespaces</a></li>
              <li class="defaultLink"><a href="qtglobal.html">Global Declarations</a></li>
              <li class="defaultLink"><a href="qdeclarativeelements.html">QML elements</a></li>
            </ul> 
          </div>
        </div>
        <div class="box bottombar" id="topics">
          <h2 title="Qt Topics"><span></span>
            Qt Topics</h2>
          <div id="list002" class="list">
            <ul id="ul002" >
               <li class="defaultLink"><a href="qt-basic-concepts.html">Programming with Qt</a></li> 
               <li class="defaultLink"><a href="qtquick.html">Device UIs &amp; Qt Quick</a></li> 
               <li class="defaultLink"><a href="qt-gui-concepts.html">UI Design with Qt</a></li> 
               <li class="defaultLink"><a href="supported-platforms.html">Supported Platforms</a></li>  
               <li class="defaultLink"><a href="technology-apis.html">Qt and Key Technologies</a></li> 
               <li class="defaultLink"><a href="best-practices.html">How-To's and Best Practices</a></li> 
            </ul>  
          </div>
        </div>
        <div class="box" id="examples">
          <h2 title="Examples"><span></span>
            Examples</h2>
          <div id="list003" class="list">
        <ul id="ul003">
              <li class="defaultLink"><a href="all-examples.html">Examples</a></li>
              <li class="defaultLink"><a href="tutorials.html">Tutorials</a></li>
              <li class="defaultLink"><a href="demos.html">Demos</a></li>
              <li class="defaultLink"><a href="qdeclarativeexamples.html">QML Examples</a></li>
            </ul> 
          </div>
        </div>
      </div>
      <div class="wrap">
        <div class="toolbar">
          <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>Screenshot Example</li>
            </ul>
          </div>
          <div class="toolbuttons toolblock">
            <ul>
              <li id="smallA" class="t_button">A</li>
              <li id="medA" class="t_button active">A</li>
              <li id="bigA" class="t_button">A</li>
              <li id="print" class="t_button"><a href="javascript:this.print();">
                <span>Print</span></a></li>
            </ul>
        </div>
        </div>
        <div class="content mainContent">
<div class="toc">
<h3><a name="toc">Contents</a></h3>
<ul>
<li class="level1"><a href="#screenshot-class-definition">Screenshot Class Definition</a></li>
<li class="level1"><a href="#screenshot-class-implementation">Screenshot Class Implementation</a></li>
</ul>
</div>
<h1 class="title">Screenshot Example</h1>
<span class="subtitle"></span>
<!-- $$$desktop/screenshot-description -->
<div class="descr"> <a name="details"></a>
<p>Files:</p>
<ul>
<li><a href="desktop-screenshot-screenshot-cpp.html">desktop/screenshot/screenshot.cpp</a></li>
<li><a href="desktop-screenshot-screenshot-h.html">desktop/screenshot/screenshot.h</a></li>
<li><a href="desktop-screenshot-main-cpp.html">desktop/screenshot/main.cpp</a></li>
<li><a href="desktop-screenshot-screenshot-pro.html">desktop/screenshot/screenshot.pro</a></li>
</ul>
<p>The Screenshot example shows how to take a screenshot of the desktop using <a href="qapplication.html">QApplication</a> and <a href="qdesktopwidget.html">QDesktopWidget</a>. It also shows how to use <a href="qtimer.html">QTimer</a> to provide a single-shot timer, and how to reimplement the <a href="qwidget.html#resizeEvent">QWidget::resizeEvent</a>() event handler to make sure that an application resizes smoothly and without data loss.<p class="centerAlign"><img src="images/screenshot-example.png" alt="" /></p><p>With the application the users can take a screenshot of their desktop. They are provided with a couple of options:</p>
<ul>
<li>Delaying the screenshot, giving them time to rearrange their desktop.</li>
<li>Hiding the application's window while the screenshot is taken.</li>
</ul>
<p>In addition the application allows the users to save their screenshot if they want to.</p>
<a name="screenshot-class-definition"></a>
<h2>Screenshot Class Definition</h2>
<pre class="cpp"> <span class="keyword">class</span> Screenshot : <span class="keyword">public</span> <span class="type"><a href="qwidget.html">QWidget</a></span>
 {
     Q_OBJECT

 <span class="keyword">public</span>:
     Screenshot();

 <span class="keyword">protected</span>:
     <span class="type">void</span> resizeEvent(<span class="type"><a href="qresizeevent.html">QResizeEvent</a></span> <span class="operator">*</span>event);

 <span class="keyword">private</span> <span class="keyword">slots</span>:
     <span class="type">void</span> newScreenshot();
     <span class="type">void</span> saveScreenshot();
     <span class="type">void</span> shootScreen();
     <span class="type">void</span> updateCheckBox();

 <span class="keyword">private</span>:
     <span class="type">void</span> createOptionsGroupBox();
     <span class="type">void</span> createButtonsLayout();
     <span class="type"><a href="qpushbutton.html">QPushButton</a></span> <span class="operator">*</span>createButton(<span class="keyword">const</span> <span class="type"><a href="qstring.html">QString</a></span> <span class="operator">&amp;</span>text<span class="operator">,</span> <span class="type"><a href="qwidget.html">QWidget</a></span> <span class="operator">*</span>receiver<span class="operator">,</span>
                               <span class="keyword">const</span> <span class="type">char</span> <span class="operator">*</span>member);
     <span class="type">void</span> updateScreenshotLabel();

     <span class="type"><a href="qpixmap.html">QPixmap</a></span> originalPixmap;

     <span class="type"><a href="qlabel.html">QLabel</a></span> <span class="operator">*</span>screenshotLabel;
     <span class="type"><a href="qgroupbox.html">QGroupBox</a></span> <span class="operator">*</span>optionsGroupBox;
     <span class="type"><a href="qspinbox.html">QSpinBox</a></span> <span class="operator">*</span>delaySpinBox;
     <span class="type"><a href="qlabel.html">QLabel</a></span> <span class="operator">*</span>delaySpinBoxLabel;
     <span class="type"><a href="qcheckbox.html">QCheckBox</a></span> <span class="operator">*</span>hideThisWindowCheckBox;
     <span class="type"><a href="qpushbutton.html">QPushButton</a></span> <span class="operator">*</span>newScreenshotButton;
     <span class="type"><a href="qpushbutton.html">QPushButton</a></span> <span class="operator">*</span>saveScreenshotButton;
     <span class="type"><a href="qpushbutton.html">QPushButton</a></span> <span class="operator">*</span>quitScreenshotButton;

     <span class="type"><a href="qvboxlayout.html">QVBoxLayout</a></span> <span class="operator">*</span>mainLayout;
     <span class="type"><a href="qgridlayout.html">QGridLayout</a></span> <span class="operator">*</span>optionsGroupBoxLayout;
     <span class="type"><a href="qhboxlayout.html">QHBoxLayout</a></span> <span class="operator">*</span>buttonsLayout;
 };</pre>
<p>The <tt>Screenshot</tt> class inherits <a href="qwidget.html">QWidget</a> and is the application's main widget. It displays the application options and a preview of the screenshot.</p>
<p>We reimplement the <a href="qwidget.html#resizeEvent">QWidget::resizeEvent</a>() function to make sure that the preview of the screenshot scales properly when the user resizes the application widget. We also need several private slots to facilitate the options:</p>
<ul>
<li>The <tt>newScreenshot()</tt> slot prepares a new screenshot.</li>
<li>The <tt>saveScreenshot()</tt> slot saves the last screenshot.</li>
<li>The <tt>shootScreen()</tt> slot takes the screenshot.</li>
<li>The <tt>updateCheckBox()</tt> slot enables or disables the <b>Hide This Window</b> option.</li>
</ul>
<p>We also declare some private functions: We use the <tt>createOptionsGroupBox()</tt>, <tt>createButtonsLayout()</tt> and <tt>createButton()</tt> functions when we construct the widget. And we call the private <tt>updateScreenshotLabel()</tt> function whenever a new screenshot is taken or when a resize event changes the size of the screenshot preview label.</p>
<p>In addition we need to store the screenshot's original pixmap. The reason is that when we display the preview of the screenshot, we need to scale its pixmap, storing the original we make sure that no data are lost in that process.</p>
<a name="screenshot-class-implementation"></a>
<h2>Screenshot Class Implementation</h2>
<pre class="cpp"> Screenshot<span class="operator">::</span>Screenshot()
 {
     screenshotLabel <span class="operator">=</span> <span class="keyword">new</span> <span class="type"><a href="qlabel.html">QLabel</a></span>;
     screenshotLabel<span class="operator">-</span><span class="operator">&gt;</span>setSizePolicy(<span class="type"><a href="qsizepolicy.html">QSizePolicy</a></span><span class="operator">::</span>Expanding<span class="operator">,</span>
                                    <span class="type"><a href="qsizepolicy.html">QSizePolicy</a></span><span class="operator">::</span>Expanding);
     screenshotLabel<span class="operator">-</span><span class="operator">&gt;</span>setAlignment(<span class="type"><a href="qt.html">Qt</a></span><span class="operator">::</span>AlignCenter);
     screenshotLabel<span class="operator">-</span><span class="operator">&gt;</span>setMinimumSize(<span class="number">240</span><span class="operator">,</span> <span class="number">160</span>);

     createOptionsGroupBox();
     createButtonsLayout();

     mainLayout <span class="operator">=</span> <span class="keyword">new</span> <span class="type"><a href="qvboxlayout.html">QVBoxLayout</a></span>;
     mainLayout<span class="operator">-</span><span class="operator">&gt;</span>addWidget(screenshotLabel);
     mainLayout<span class="operator">-</span><span class="operator">&gt;</span>addWidget(optionsGroupBox);
     mainLayout<span class="operator">-</span><span class="operator">&gt;</span>addLayout(buttonsLayout);
     setLayout(mainLayout);

     shootScreen();
     delaySpinBox<span class="operator">-</span><span class="operator">&gt;</span>setValue(<span class="number">5</span>);

     setWindowTitle(tr(<span class="string">&quot;Screenshot&quot;</span>));
     resize(<span class="number">300</span><span class="operator">,</span> <span class="number">200</span>);
 }</pre>
<p>In the constructor we first create the <a href="qlabel.html">QLabel</a> displaying the screenshot preview.</p>
<p>We set the <a href="qlabel.html">QLabel</a>'s size policy to be <a href="qsizepolicy.html#Policy-enum">QSizePolicy::Expanding</a> both horizontally and vertically. This means that the <a href="qlabel.html">QLabel</a>'s size hint is a sensible size, but the widget can be shrunk and still be useful. Also, the widget can make use of extra space, so it should get as much space as possible. Then we make sure the <a href="qlabel.html">QLabel</a> is aligned in the center of the <tt>Screenshot</tt> widget, and set its minimum size.</p>
<p>We create the applications's buttons and the group box containing the application's options, and put it all into a main layout. Finally we take the initial screenshot, and set the inital delay and the window title, before we resize the widget to a suitable size.</p>
<pre class="cpp"> <span class="type">void</span> Screenshot<span class="operator">::</span>resizeEvent(<span class="type"><a href="qresizeevent.html">QResizeEvent</a></span> <span class="operator">*</span> <span class="comment">/* event */</span>)
 {
     <span class="type"><a href="qsize.html">QSize</a></span> scaledSize <span class="operator">=</span> originalPixmap<span class="operator">.</span>size();
     scaledSize<span class="operator">.</span>scale(screenshotLabel<span class="operator">-</span><span class="operator">&gt;</span>size()<span class="operator">,</span> <span class="type"><a href="qt.html">Qt</a></span><span class="operator">::</span>KeepAspectRatio);
     <span class="keyword">if</span> (<span class="operator">!</span>screenshotLabel<span class="operator">-</span><span class="operator">&gt;</span>pixmap()
             <span class="operator">|</span><span class="operator">|</span> scaledSize <span class="operator">!</span><span class="operator">=</span> screenshotLabel<span class="operator">-</span><span class="operator">&gt;</span>pixmap()<span class="operator">-</span><span class="operator">&gt;</span>size())
         updateScreenshotLabel();
 }</pre>
<p>The <tt>resizeEvent()</tt> function is reimplemented to receive the resize events dispatched to the widget. The purpose is to scale the preview screenshot pixmap without deformation of its content, and also make sure that the application can be resized smoothly.</p>
<p>To achieve the first goal, we scale the screenshot pixmap using <a href="qt.html#AspectRatioMode-enum">Qt::KeepAspectRatio</a>. We scale the pixmap to a rectangle as large as possible inside the current size of the screenshot preview label, preserving the aspect ratio. This means that if the user resizes the application window in only one direction, the preview screenshot keeps the same size.</p>
<p>To reach our second goal, we make sure that the preview screenshot only is repainted (using the private <tt>updateScreenshotLabel()</tt> function) when it actually changes its size.</p>
<pre class="cpp"> <span class="type">void</span> Screenshot<span class="operator">::</span>newScreenshot()
 {
     <span class="keyword">if</span> (hideThisWindowCheckBox<span class="operator">-</span><span class="operator">&gt;</span>isChecked())
         hide();
     newScreenshotButton<span class="operator">-</span><span class="operator">&gt;</span>setDisabled(<span class="keyword">true</span>);

     <span class="type"><a href="qtimer.html">QTimer</a></span><span class="operator">::</span>singleShot(delaySpinBox<span class="operator">-</span><span class="operator">&gt;</span>value() <span class="operator">*</span> <span class="number">1000</span><span class="operator">,</span> <span class="keyword">this</span><span class="operator">,</span> SLOT(shootScreen()));
 }</pre>
<p>The private <tt>newScreenshot()</tt> slot is called when the user requests a new screenshot; but the slot only prepares a new screenshot.</p>
<p>First we see if the <b>Hide This Window</b> option is checked, if it is we hide the <tt>Screenshot</tt> widget. Then we disable the <b>New Screenshot</b> button, to make sure the user only can request one screenshot at a time.</p>
<p>We create a timer using the <a href="qtimer.html">QTimer</a> class which provides repetitive and single-shot timers. We set the timer to time out only once, using the static <a href="qtimer.html#singleShot">QTimer::singleShot</a>() function. This function calls the private <tt>shootScreen()</tt> slot after the time interval specified by the <b>Screenshot Delay</b> option. It is <tt>shootScreen()</tt> that actually performs the screenshot.</p>
<pre class="cpp"> <span class="type">void</span> Screenshot<span class="operator">::</span>saveScreenshot()
 {
     <span class="type"><a href="qstring.html">QString</a></span> format <span class="operator">=</span> <span class="string">&quot;png&quot;</span>;
     <span class="type"><a href="qstring.html">QString</a></span> initialPath <span class="operator">=</span> <span class="type"><a href="qdir.html">QDir</a></span><span class="operator">::</span>currentPath() <span class="operator">+</span> tr(<span class="string">&quot;/untitled.&quot;</span>) <span class="operator">+</span> format;

     <span class="type"><a href="qstring.html">QString</a></span> fileName <span class="operator">=</span> <span class="type"><a href="qfiledialog.html">QFileDialog</a></span><span class="operator">::</span>getSaveFileName(<span class="keyword">this</span><span class="operator">,</span> tr(<span class="string">&quot;Save As&quot;</span>)<span class="operator">,</span>
                                initialPath<span class="operator">,</span>
                                tr(<span class="string">&quot;%1 Files (*.%2);;All Files (*)&quot;</span>)
                                <span class="operator">.</span>arg(format<span class="operator">.</span>toUpper())
                                <span class="operator">.</span>arg(format));
     <span class="keyword">if</span> (<span class="operator">!</span>fileName<span class="operator">.</span>isEmpty())
         originalPixmap<span class="operator">.</span>save(fileName<span class="operator">,</span> format<span class="operator">.</span>toAscii());
 }</pre>
<p>The <tt>saveScreenshot()</tt> slot is called when the user push the <b>Save</b> button, and it presents a file dialog using the <a href="qfiledialog.html">QFileDialog</a> class.</p>
<p><a href="qfiledialog.html">QFileDialog</a> enables a user to traverse the file system in order to select one or many files or a directory. The easiest way to create a <a href="qfiledialog.html">QFileDialog</a> is to use the convenience static functions.</p>
<p>We define the default file format to be png, and we make the file dialog's initial path the path the application is run from. We create the file dialog using the static <a href="qfiledialog.html#getSaveFileName">QFileDialog::getSaveFileName</a>() function which returns a file name selected by the user. The file does not have to exist. If the file name is valid, we use the <a href="qpixmap.html#save">QPixmap::save</a>() function to save the screenshot's original pixmap in that file.</p>
<pre class="cpp"> <span class="type">void</span> Screenshot<span class="operator">::</span>shootScreen()
 {
     <span class="keyword">if</span> (delaySpinBox<span class="operator">-</span><span class="operator">&gt;</span>value() <span class="operator">!</span><span class="operator">=</span> <span class="number">0</span>)
         qApp<span class="operator">-</span><span class="operator">&gt;</span>beep();</pre>
<p>The <tt>shootScreen()</tt> slot is called to take the screenshot. If the user has chosen to delay the screenshot, we make the application beep when the screenshot is taken using the static <a href="qapplication.html#beep">QApplication::beep</a>() function.</p>
<p>The <a href="qapplication.html">QApplication</a> class manages the GUI application's control flow and main settings. It contains the main event loop, where all events from the window system and other sources are processed and dispatched.</p>
<pre class="cpp">     originalPixmap <span class="operator">=</span> <span class="type"><a href="qpixmap.html">QPixmap</a></span><span class="operator">::</span>grabWindow(<span class="type"><a href="qapplication.html">QApplication</a></span><span class="operator">::</span>desktop()<span class="operator">-</span><span class="operator">&gt;</span>winId());
     updateScreenshotLabel();

     newScreenshotButton<span class="operator">-</span><span class="operator">&gt;</span>setDisabled(<span class="keyword">false</span>);
     <span class="keyword">if</span> (hideThisWindowCheckBox<span class="operator">-</span><span class="operator">&gt;</span>isChecked())
         show();
 }</pre>
<p>We take the screenshot using the static <a href="qpixmap.html#grabWindow">QPixmap::grabWindow</a>() function. The function grabs the contents of the window passed as an argument, makes a pixmap out of it and returns that pixmap.</p>
<p>We identify the argument window using the QWidget::winID() function which returns the window system identifier. Here it returns the identifier of the current <a href="qdesktopwidget.html">QDesktopWidget</a> retrieved by the <a href="qapplication.html#desktop">QApplication::desktop</a>() function. The <a href="qdesktopwidget.html">QDesktopWidget</a> class provides access to screen information, and inherits QWidget::winID().</p>
<p>We update the screenshot preview label using the private <tt>updateScreenshotLabel()</tt> function. Then we enable the <b>New Screenshot</b> button, and finally we make the <tt>Screenshot</tt> widget visible if it was hidden during the screenshot.</p>
<pre class="cpp"> <span class="type">void</span> Screenshot<span class="operator">::</span>updateCheckBox()
 {
     <span class="keyword">if</span> (delaySpinBox<span class="operator">-</span><span class="operator">&gt;</span>value() <span class="operator">=</span><span class="operator">=</span> <span class="number">0</span>) {
         hideThisWindowCheckBox<span class="operator">-</span><span class="operator">&gt;</span>setDisabled(<span class="keyword">true</span>);
         hideThisWindowCheckBox<span class="operator">-</span><span class="operator">&gt;</span>setChecked(<span class="keyword">false</span>);
     }
     <span class="keyword">else</span>
         hideThisWindowCheckBox<span class="operator">-</span><span class="operator">&gt;</span>setDisabled(<span class="keyword">false</span>);
 }</pre>
<p>The <b>Hide This Window</b> option is enabled or disabled depending on the delay of the screenshot. If there is no delay, the application window cannot be hidden and the option's checkbox is disabled.</p>
<p>The <tt>updateCheckBox()</tt> slot is called whenever the user changes the delay using the <b>Screenshot Delay</b> option.</p>
<pre class="cpp"> <span class="type">void</span> Screenshot<span class="operator">::</span>createOptionsGroupBox()
 {
     optionsGroupBox <span class="operator">=</span> <span class="keyword">new</span> <span class="type"><a href="qgroupbox.html">QGroupBox</a></span>(tr(<span class="string">&quot;Options&quot;</span>));

     delaySpinBox <span class="operator">=</span> <span class="keyword">new</span> <span class="type"><a href="qspinbox.html">QSpinBox</a></span>;
     delaySpinBox<span class="operator">-</span><span class="operator">&gt;</span>setSuffix(tr(<span class="string">&quot; s&quot;</span>));
     delaySpinBox<span class="operator">-</span><span class="operator">&gt;</span>setMaximum(<span class="number">60</span>);
     connect(delaySpinBox<span class="operator">,</span> SIGNAL(valueChanged(<span class="type">int</span>))<span class="operator">,</span> <span class="keyword">this</span><span class="operator">,</span> SLOT(updateCheckBox()));

     delaySpinBoxLabel <span class="operator">=</span> <span class="keyword">new</span> <span class="type"><a href="qlabel.html">QLabel</a></span>(tr(<span class="string">&quot;Screenshot Delay:&quot;</span>));

     hideThisWindowCheckBox <span class="operator">=</span> <span class="keyword">new</span> <span class="type"><a href="qcheckbox.html">QCheckBox</a></span>(tr(<span class="string">&quot;Hide This Window&quot;</span>));

     optionsGroupBoxLayout <span class="operator">=</span> <span class="keyword">new</span> <span class="type"><a href="qgridlayout.html">QGridLayout</a></span>;
     optionsGroupBoxLayout<span class="operator">-</span><span class="operator">&gt;</span>addWidget(delaySpinBoxLabel<span class="operator">,</span> <span class="number">0</span><span class="operator">,</span> <span class="number">0</span>);
     optionsGroupBoxLayout<span class="operator">-</span><span class="operator">&gt;</span>addWidget(delaySpinBox<span class="operator">,</span> <span class="number">0</span><span class="operator">,</span> <span class="number">1</span>);
     optionsGroupBoxLayout<span class="operator">-</span><span class="operator">&gt;</span>addWidget(hideThisWindowCheckBox<span class="operator">,</span> <span class="number">1</span><span class="operator">,</span> <span class="number">0</span><span class="operator">,</span> <span class="number">1</span><span class="operator">,</span> <span class="number">2</span>);
     optionsGroupBox<span class="operator">-</span><span class="operator">&gt;</span>setLayout(optionsGroupBoxLayout);
 }</pre>
<p>The private <tt>createOptionsGroupBox()</tt> function is called from the constructor.</p>
<p>First we create a group box that will contain all of the options' widgets. Then we create a <a href="qspinbox.html">QSpinBox</a> and a <a href="qlabel.html">QLabel</a> for the <b>Screenshot Delay</b> option, and connect the spinbox to the <tt>updateCheckBox()</tt> slot. Finally, we create a <a href="qcheckbox.html">QCheckBox</a> for the <b>Hide This Window</b> option, add all the options' widgets to a <a href="qgridlayout.html">QGridLayout</a> and install the layout on the group box.</p>
<p>Note that we don't have to specify any parents for the widgets when we create them. The reason is that when we add a widget to a layout and install the layout on another widget, the layout's widgets are automatically reparented to the widget the layout is installed on.</p>
<pre class="cpp"> <span class="type">void</span> Screenshot<span class="operator">::</span>createButtonsLayout()
 {
     newScreenshotButton <span class="operator">=</span> createButton(tr(<span class="string">&quot;New Screenshot&quot;</span>)<span class="operator">,</span>
                                        <span class="keyword">this</span><span class="operator">,</span> SLOT(newScreenshot()));

     saveScreenshotButton <span class="operator">=</span> createButton(tr(<span class="string">&quot;Save Screenshot&quot;</span>)<span class="operator">,</span>
                                         <span class="keyword">this</span><span class="operator">,</span> SLOT(saveScreenshot()));

     quitScreenshotButton <span class="operator">=</span> createButton(tr(<span class="string">&quot;Quit&quot;</span>)<span class="operator">,</span> <span class="keyword">this</span><span class="operator">,</span> SLOT(close()));

     buttonsLayout <span class="operator">=</span> <span class="keyword">new</span> <span class="type"><a href="qhboxlayout.html">QHBoxLayout</a></span>;
     buttonsLayout<span class="operator">-</span><span class="operator">&gt;</span>addStretch();
     buttonsLayout<span class="operator">-</span><span class="operator">&gt;</span>addWidget(newScreenshotButton);
     buttonsLayout<span class="operator">-</span><span class="operator">&gt;</span>addWidget(saveScreenshotButton);
     buttonsLayout<span class="operator">-</span><span class="operator">&gt;</span>addWidget(quitScreenshotButton);
 }</pre>
<p>The private <tt>createButtonsLayout()</tt> function is called from the constructor. We create the application's buttons using the private <tt>createButton()</tt> function, and add them to a <a href="qhboxlayout.html">QHBoxLayout</a>.</p>
<pre class="cpp"> <span class="type"><a href="qpushbutton.html">QPushButton</a></span> <span class="operator">*</span>Screenshot<span class="operator">::</span>createButton(<span class="keyword">const</span> <span class="type"><a href="qstring.html">QString</a></span> <span class="operator">&amp;</span>text<span class="operator">,</span> <span class="type"><a href="qwidget.html">QWidget</a></span> <span class="operator">*</span>receiver<span class="operator">,</span>
                                       <span class="keyword">const</span> <span class="type">char</span> <span class="operator">*</span>member)
 {
     <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>(text);
     button<span class="operator">-</span><span class="operator">&gt;</span>connect(button<span class="operator">,</span> SIGNAL(clicked())<span class="operator">,</span> receiver<span class="operator">,</span> member);
     <span class="keyword">return</span> button;
 }</pre>
<p>The private <tt>createButton()</tt> function is called from the <tt>createButtonsLayout()</tt> function. It simply creates a <a href="qpushbutton.html">QPushButton</a> with the provided text, connects it to the provided receiver and slot, and returns a pointer to the button.</p>
<pre class="cpp"> <span class="type">void</span> Screenshot<span class="operator">::</span>updateScreenshotLabel()
 {
     screenshotLabel<span class="operator">-</span><span class="operator">&gt;</span>setPixmap(originalPixmap<span class="operator">.</span>scaled(screenshotLabel<span class="operator">-</span><span class="operator">&gt;</span>size()<span class="operator">,</span>
                                                      <span class="type"><a href="qt.html">Qt</a></span><span class="operator">::</span>KeepAspectRatio<span class="operator">,</span>
                                                      <span class="type"><a href="qt.html">Qt</a></span><span class="operator">::</span>SmoothTransformation));
 }</pre>
<p>The private <tt>updateScreenshotLabel()</tt> function is called whenever the screenshot changes, or when a resize event changes the size of the screenshot preview label. It updates the screenshot preview's label using the <a href="qlabel.html#pixmap-prop">QLabel::setPixmap</a>() and <a href="qpixmap.html#scaled">QPixmap::scaled</a>() functions.</p>
<p><a href="qpixmap.html#scaled">QPixmap::scaled</a>() returns a copy of the given pixmap scaled to a rectangle of the given size according to the given <a href="qt.html#AspectRatioMode-enum">Qt::AspectRatioMode</a> and <a href="qt.html#TransformationMode-enum">Qt::TransformationMode</a>.</p>
<p>We scale the original pixmap to fit the current screenshot label's size, preserving the aspect ratio and giving the resulting pixmap smoothed edges.</p>
</div>
<!-- @@@desktop/screenshot -->
      </div>
    </div>
    </div> 
    <div class="ft">
      <span></span>
    </div>
  </div> 
  <div class="footer">
    <p>
      <acronym title="Copyright">&copy;</acronym> 2015 The Qt Company Ltd.
      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>
      Qt and respective logos are trademarks of The Qt Company Ltd 
      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>

  <script src="scripts/functions.js" type="text/javascript"></script>
</body>
</html>