Sophie

Sophie

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

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" />
<!-- addressbook.qdoc -->
  <title>Qt 4.8: Part 6 - Loading and Saving</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>Part 6 - Loading and Saving</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="#defining-the-addressbook-class">Defining the AddressBook Class</a></li>
<li class="level1"><a href="#implementing-the-addressbook-class">Implementing the AddressBook Class</a></li>
</ul>
</div>
<h1 class="title">Part 6 - Loading and Saving</h1>
<span class="subtitle"></span>
<!-- $$$tutorials/addressbook/part6-description -->
<div class="descr"> <a name="details"></a>
<p>Files:</p>
<ul>
<li><a href="tutorials-addressbook-part6-addressbook-cpp.html">tutorials/addressbook/part6/addressbook.cpp</a></li>
<li><a href="tutorials-addressbook-part6-addressbook-h.html">tutorials/addressbook/part6/addressbook.h</a></li>
<li><a href="tutorials-addressbook-part6-finddialog-cpp.html">tutorials/addressbook/part6/finddialog.cpp</a></li>
<li><a href="tutorials-addressbook-part6-finddialog-h.html">tutorials/addressbook/part6/finddialog.h</a></li>
<li><a href="tutorials-addressbook-part6-main-cpp.html">tutorials/addressbook/part6/main.cpp</a></li>
<li><a href="tutorials-addressbook-part6-part6-pro.html">tutorials/addressbook/part6/part6.pro</a></li>
</ul>
<p>This part covers the Qt file handling features we use to write loading and saving routines for the address book.</p>
<p class="centerAlign"><img src="images/addressbook-tutorial-part6-screenshot.png" alt="" /></p><p>Although browsing and searching the contact list are useful features, our address book is not complete until we can save existing contacts and load them again at a later time.</p>
<p>Qt provides a number of classes for <a href="io.html">input and output</a>, but we have chosen to use two which are simple to use in combination: <a href="qfile.html">QFile</a> and <a href="qdatastream.html">QDataStream</a>.</p>
<p>A <a href="qfile.html">QFile</a> object represents a file on disk that can be read from and written to. <a href="qfile.html">QFile</a> is a subclass of the more general <a href="qiodevice.html">QIODevice</a> class which represents many different kinds of devices.</p>
<p>A <a href="qdatastream.html">QDataStream</a> object is used to serialize binary data so that it can be stored in a <a href="qiodevice.html">QIODevice</a> and retrieved again later. Reading from a <a href="qiodevice.html">QIODevice</a> and writing to it is as simple as opening the stream - with the respective device as a parameter - and reading from or writing to it.</p>
<a name="defining-the-addressbook-class"></a>
<h2>Defining the AddressBook Class</h2>
<p>We declare two public slots, <tt>saveToFile()</tt> and <tt>loadFromFile()</tt>, as well as two <a href="qpushbutton.html">QPushButton</a> objects, <tt>loadButton</tt> and <tt>saveButton</tt>.</p>
<pre class="cpp">     <span class="type">void</span> saveToFile();
     <span class="type">void</span> loadFromFile();
     ...
     <span class="type"><a href="qpushbutton.html">QPushButton</a></span> <span class="operator">*</span>loadButton;
     <span class="type"><a href="qpushbutton.html">QPushButton</a></span> <span class="operator">*</span>saveButton;</pre>
<a name="implementing-the-addressbook-class"></a>
<h2>Implementing the AddressBook Class</h2>
<p>In our constructor, we instantiate <tt>loadButton</tt> and <tt>saveButton</tt>. Ideally, it would be more user-friendly to set the push buttons' labels to &quot;Load contacts from a file&quot; and &quot;Save contacts to a file&quot;. However, due to the size of our other push buttons, we set the labels to <b>Load..&#x2e;</b> and <b>Save..&#x2e;</b>. Fortunately, Qt provides a simple way to set tooltips with <a href="qwidget.html#toolTip-prop">setToolTip()</a> and we use it in the following way for our push buttons:</p>
<pre class="cpp">     loadButton<span class="operator">-</span><span class="operator">&gt;</span>setToolTip(tr(<span class="string">&quot;Load contacts from a file&quot;</span>));
     ...
     saveButton<span class="operator">-</span><span class="operator">&gt;</span>setToolTip(tr(<span class="string">&quot;Save contacts to a file&quot;</span>));</pre>
<p>Although it is not shown here, just like the other features we implemented, we add the push buttons to the layout panel on the right, <tt>buttonLayout1</tt>, and we connect the push buttons' <a href="qabstractbutton.html#clicked">clicked()</a> signals to their respective slots.</p>
<p>For the saving feature, we first obtain <tt>fileName</tt> using <a href="qfiledialog.html#getSaveFileName">QFileDialog::getSaveFileName</a>(). This is a convenience function provided by <a href="qfiledialog.html">QFileDialog</a>, which pops up a modal file dialog and allows the user to enter a file name or select any existing <tt>.abk</tt> file. The <tt>.abk</tt> file is our Address Book extension that we create when we save contacts.</p>
<pre class="cpp"> <span class="type">void</span> AddressBook<span class="operator">::</span>saveToFile()
 {
     <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 Address Book&quot;</span>)<span class="operator">,</span> <span class="string">&quot;&quot;</span><span class="operator">,</span>
         tr(<span class="string">&quot;Address Book (*.abk);;All Files (*)&quot;</span>));</pre>
<p>The file dialog that pops up is displayed in the screenshot below:</p>
<p class="centerAlign"><img src="images/addressbook-tutorial-part6-save.png" alt="" /></p><p>If <tt>fileName</tt> is not empty, we create a <a href="qfile.html">QFile</a> object, <tt>file</tt>, with <tt>fileName</tt>. <a href="qfile.html">QFile</a> works with <a href="qdatastream.html">QDataStream</a> as <a href="qfile.html">QFile</a> is a <a href="qiodevice.html">QIODevice</a>.</p>
<p>Next, we attempt to open the file in <a href="qiodevice.html#OpenModeFlag-enum">WriteOnly</a> mode. If this is unsuccessful, we display a <a href="qmessagebox.html">QMessageBox</a> to inform the user.</p>
<pre class="cpp">     <span class="keyword">if</span> (fileName<span class="operator">.</span>isEmpty())
         <span class="keyword">return</span>;
     <span class="keyword">else</span> {
         <span class="type"><a href="qfile.html">QFile</a></span> file(fileName);
         <span class="keyword">if</span> (<span class="operator">!</span>file<span class="operator">.</span>open(<span class="type"><a href="qiodevice.html">QIODevice</a></span><span class="operator">::</span>WriteOnly)) {
             <span class="type"><a href="qmessagebox.html">QMessageBox</a></span><span class="operator">::</span>information(<span class="keyword">this</span><span class="operator">,</span> tr(<span class="string">&quot;Unable to open file&quot;</span>)<span class="operator">,</span>
                 file<span class="operator">.</span>errorString());
             <span class="keyword">return</span>;
         }</pre>
<p>Otherwise, we instantiate a <a href="qdatastream.html">QDataStream</a> object, <tt>out</tt>, to write the open file. <a href="qdatastream.html">QDataStream</a> requires that the same version of the stream is used for reading and writing. We ensure that this is the case by setting the version used to the <a href="qdatastream.html#Version-enum">version introduced with Qt 4.5</a> before serializing the data to <tt>file</tt>.</p>
<pre class="cpp">         <span class="type"><a href="qdatastream.html">QDataStream</a></span> out(<span class="operator">&amp;</span>file);
         out<span class="operator">.</span>setVersion(<span class="type"><a href="qdatastream.html">QDataStream</a></span><span class="operator">::</span>Qt_4_5);
         out <span class="operator">&lt;</span><span class="operator">&lt;</span> contacts;
     }
 }</pre>
<p>For the loading feature, we also obtain <tt>fileName</tt> using <a href="qfiledialog.html#getOpenFileName">QFileDialog::getOpenFileName</a>(). This function, the counterpart to <a href="qfiledialog.html#getSaveFileName">QFileDialog::getSaveFileName</a>(), also pops up the modal file dialog and allows the user to enter a file name or select any existing <tt>.abk</tt> file to load it into the address book.</p>
<pre class="cpp"> <span class="type">void</span> AddressBook<span class="operator">::</span>loadFromFile()
 {
     <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>getOpenFileName(<span class="keyword">this</span><span class="operator">,</span>
         tr(<span class="string">&quot;Open Address Book&quot;</span>)<span class="operator">,</span> <span class="string">&quot;&quot;</span><span class="operator">,</span>
         tr(<span class="string">&quot;Address Book (*.abk);;All Files (*)&quot;</span>));</pre>
<p>On Windows, for example, this function pops up a native file dialog, as shown in the following screenshot.</p>
<p class="centerAlign"><img src="images/addressbook-tutorial-part6-load.png" alt="" /></p><p>If <tt>fileName</tt> is not empty, again, we use a <a href="qfile.html">QFile</a> object, <tt>file</tt>, and attempt to open it in <a href="qiodevice.html#OpenModeFlag-enum">ReadOnly</a> mode. Similar to our implementation of <tt>saveToFile()</tt>, if this attempt is unsuccessful, we display a <a href="qmessagebox.html">QMessageBox</a> to inform the user.</p>
<pre class="cpp">     <span class="keyword">if</span> (fileName<span class="operator">.</span>isEmpty())
         <span class="keyword">return</span>;
     <span class="keyword">else</span> {

         <span class="type"><a href="qfile.html">QFile</a></span> file(fileName);

         <span class="keyword">if</span> (<span class="operator">!</span>file<span class="operator">.</span>open(<span class="type"><a href="qiodevice.html">QIODevice</a></span><span class="operator">::</span>ReadOnly)) {
             <span class="type"><a href="qmessagebox.html">QMessageBox</a></span><span class="operator">::</span>information(<span class="keyword">this</span><span class="operator">,</span> tr(<span class="string">&quot;Unable to open file&quot;</span>)<span class="operator">,</span>
                 file<span class="operator">.</span>errorString());
             <span class="keyword">return</span>;
         }

         <span class="type"><a href="qdatastream.html">QDataStream</a></span> in(<span class="operator">&amp;</span>file);
         in<span class="operator">.</span>setVersion(<span class="type"><a href="qdatastream.html">QDataStream</a></span><span class="operator">::</span>Qt_4_5);
         contacts<span class="operator">.</span>empty();   <span class="comment">// empty existing contacts</span>
         in <span class="operator">&gt;</span><span class="operator">&gt;</span> contacts;</pre>
<p>Otherwise, we instantiate a <a href="qdatastream.html">QDataStream</a> object, <tt>in</tt>, set its version as above and read the serialized data into the <tt>contacts</tt> data structure. The <tt>contacts</tt> object is emptied before data is read into it to simplify the file reading process. A more advanced method would be to read the contacts into a temporary <a href="qmap.html">QMap</a> object, and copy over non-duplicate contacts into <tt>contacts</tt>.</p>
<pre class="cpp">         <span class="keyword">if</span> (contacts<span class="operator">.</span>isEmpty()) {
             <span class="type"><a href="qmessagebox.html">QMessageBox</a></span><span class="operator">::</span>information(<span class="keyword">this</span><span class="operator">,</span> tr(<span class="string">&quot;No contacts in file&quot;</span>)<span class="operator">,</span>
                 tr(<span class="string">&quot;The file you are attempting to open contains no contacts.&quot;</span>));
         } <span class="keyword">else</span> {
             <span class="type"><a href="qmap.html">QMap</a></span><span class="operator">&lt;</span><span class="type"><a href="qstring.html">QString</a></span><span class="operator">,</span> <span class="type"><a href="qstring.html">QString</a></span><span class="operator">&gt;</span><span class="operator">::</span>iterator i <span class="operator">=</span> contacts<span class="operator">.</span>begin();
             nameLine<span class="operator">-</span><span class="operator">&gt;</span>setText(i<span class="operator">.</span>key());
             addressText<span class="operator">-</span><span class="operator">&gt;</span>setText(i<span class="operator">.</span>value());
         }
     }

     updateInterface(NavigationMode);
 }</pre>
<p>To display the contacts that have been read from the file, we must first validate the data obtained to ensure that the file we read from actually contains address book contacts. If it does, we display the first contact; otherwise, we display a <a href="qmessagebox.html">QMessageBox</a> to inform the user about the problem. Lastly, we update the interface to enable and disable the push buttons accordingly.</p>
</div>
<!-- @@@tutorials/addressbook/part6 -->
      </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>