Sophie

Sophie

distrib > Mageia > 7 > x86_64 > by-pkgid > 1dd17e0d683ef79b4bb6872bbf359d7f > files > 7683

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-fr.qdoc -->
  <title>Qt 4.8: Carnet d'Adresses 6 - Sauvegarde et chargement</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>Carnet d'Adresses 6 - Sauvegarde et chargement</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="#d-finition-de-la-classe-addressbook">Définition de la classe AddressBook</a></li>
<li class="level1"><a href="#impl-mentation-de-la-classe-addressbook">Implémentation de la classe AddressBook</a></li>
</ul>
</div>
<h1 class="title">Carnet d'Adresses 6 - Sauvegarde et chargement</h1>
<span class="subtitle"></span>
<!-- $$$tutorials/addressbook-fr/part6-description -->
<div class="descr"> <a name="details"></a>
<p>Files:</p>
<ul>
<li><a href="tutorials-addressbook-fr-part6-addressbook-cpp.html">tutorials/addressbook-fr/part6/addressbook.cpp</a></li>
<li><a href="tutorials-addressbook-fr-part6-addressbook-h.html">tutorials/addressbook-fr/part6/addressbook.h</a></li>
<li><a href="tutorials-addressbook-fr-part6-finddialog-cpp.html">tutorials/addressbook-fr/part6/finddialog.cpp</a></li>
<li><a href="tutorials-addressbook-fr-part6-finddialog-h.html">tutorials/addressbook-fr/part6/finddialog.h</a></li>
<li><a href="tutorials-addressbook-fr-part6-main-cpp.html">tutorials/addressbook-fr/part6/main.cpp</a></li>
<li><a href="tutorials-addressbook-fr-part6-part6-pro.html">tutorials/addressbook-fr/part6/part6.pro</a></li>
</ul>
<p>Ce chapitre couvre les fonctionnalités de gestion des fichiers de Qt que l'on utilise pour écrire les procédures de sauvegarde et chargement pour l'application carnet d'adresses.</p>
<p class="centerAlign"><img src="images/addressbook-tutorial-part6-screenshot.png" alt="" /></p><p>Bien que la navigation et la recherche de contacts soient des fonctionnalités importantes, notre carnet d'adresses ne sera pleinement utilisable qu'une fois que l'on pourra sauvegarder les contacts existants et les charger à nouveau par la suite. Qt fournit de nombreuses classes pour gérer les <a href="io.html">entrées et sorties</a>, mais nous avons choisi de nous contenter d'une combinaison de deux classes simples à utiliser ensemble: <a href="qfile.html">QFile</a> et <a href="qdatastream.html">QDataStream</a>.</p>
<p>Un objet <a href="qfile.html">QFile</a> représente un fichier sur le disque qui peut être lu, et dans lequel on peut écrire. <a href="qfile.html">QFile</a> est une classe fille de la classe plus générique <a href="qiodevice.html">QIODevice</a>, qui peut représenter différents types de périphériques.</p>
<p>Un objet <a href="qdatastream.html">QDataStream</a> est utilisé pour sérialiser des données binaires dans le but de les passer à un <a href="qiodevice.html">QIODevice</a> pour les récupérer dans le futur. Pour lire ou écrire dans un <a href="qiodevice.html">QIODevice</a>, il suffit d'ouvrir le flux, avec le périphérique approprié en paramètre, et d'y lire ou écrire.</p>
<a name="d-finition-de-la-classe-addressbook"></a>
<h2>Définition de la classe AddressBook</h2>
<p>On déclare deux slots publics, <tt>saveToFile()</tt> et <tt>loadFromFile()</tt>, ainsi que deux objets <a href="qpushbutton.html">QPushButton</a>, <tt>loadButton</tt> et <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="impl-mentation-de-la-classe-addressbook"></a>
<h2>Implémentation de la classe AddressBook</h2>
<p>Dans notre constructeur, on instancie <tt>loadButton</tt> et <tt>saveButton</tt>. Idéalement, l'interface serait plus conviviale avec des boutons affichant &quot;Load contacts from a file&quot; et &quot;Save contacts to a file&quot;. Mais compte tenu de la dimension des autres boutons, on initialise les labels des boutons à <b>Load..&#x2e;</b> et <b>Save..&#x2e;</b>. Heureusement, Qt offre une façon simple d'ajouter des info-bulles avec <a href="qwidget.html#toolTip-prop">setToolTip()</a>, et nous l'exploitons de la façon suivante pour nos boutons:</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>Bien qu'on ne cite pas le code correspondant ici, nous ajoutons ces deux boutons au layout de droite, <tt>button1Layout</tt>, comme pour les fonctionnalités précédentes, et nous connectons leurs signaux <a href="qabstractbutton.html#clicked">clicked()</a> à leurs slots respectifs.</p>
<p>Pour la sauvegarde, on commence par récupérer le nom de fichier <tt>fileName</tt>, en utilisant <a href="qfiledialog.html#getSaveFileName">QFileDialog::getSaveFileName</a>(). C'est une méthode pratique fournie par <a href="qfiledialog.html">QFileDialog</a>, qui ouvre une boîte de dialogue modale et permet à l'utilisateur d'entrer un nom de fichier ou de choisir un fichier <tt>.abk</tt> existant. Les fichiers <tt>.abk</tt> correspondent à l'extension choisie pour la sauvegarde des contacts de notre carnet d'adresses.</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>La boîte de dialogue affichée est visible sur la capture d'écran ci- dessous.</p>
<p class="centerAlign"><img src="images/addressbook-tutorial-part6-save.png" alt="" /></p><p>Si <tt>fileName</tt> n'est pas vide, on crée un objet <a href="qfile.html">QFile</a>, <tt>file</tt>, à partir de <tt>fileName</tt>. <a href="qfile.html">QFile</a> fonctionne avec <a href="qdatastream.html">QDataStream</a> puisqu'il dérive de <a href="qiodevice.html">QIODevice</a>.</p>
<p>Ensuite, on essaie d'ouvrir le fichier en écriture, ce qui correspond au mode <a href="qiodevice.html#OpenModeFlag-enum">WriteOnly</a>. Si cela échoue, on en informe l'utilisateur avec une <a href="qmessagebox.html">QMessageBox</a>.</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>Dans le cas contraire, on instancie un objet <a href="qdatastream.html">QDataStream</a>, <tt>out</tt>, afin d'écrire dans le fichier ouvert. <a href="qdatastream.html">QDataStream</a> nécessite que la même version de flux soit utilisée pour la lecture et l'écriture. On s'assure que c'est le cas en spécifiant explicitement d'utiliser la <a href="qdatastream.html#Version-enum">version introduite avec Qt 4.5</a> avant de sérialiser les données vers le fichier <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>Pour le chargement, on récupère également <tt>fileName</tt> en utilisant <a href="qfiledialog.html#getOpenFileName">QFileDialog::getOpenFileName</a>(). Cette méthode est l'homologue de <a href="qfiledialog.html#getSaveFileName">QFileDialog::getSaveFileName</a>() et affiche également une boîte de dialogue modale permettant à l'utilisateur d'entrer un nom de fichier ou de selectionner un fichier <tt>.abk</tt> existant, afin de le charger dans le carnet d'adresses.</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>Sous Windows, par exemple, cette méthode affiche une boîte de dialogue native pour la sélection de fichier, comme illustré sur la capture d'écran suivante:</p>
<p class="centerAlign"><img src="images/addressbook-tutorial-part6-load.png" alt="" /></p><p>Si <tt>fileName</tt> n'est pas vide, on utilise une fois de plus un objet <a href="qfile.html">QFile</a>, <tt>file</tt>, et on tente de l'ouvrir en lecture, avec le mode <a href="qiodevice.html#OpenModeFlag-enum">ReadOnly</a>. De même que précédemment dans notre implémentation de <tt>saveToFile()</tt>, si cette tentative s'avère infructueuse, on en informe l'utilisateur par le biais d'une <a href="qmessagebox.html">QMessageBox</a>.</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>Dans le cas contraire, on instancie un objet <a href="qdatastream.html">QDataStream</a>, <tt>in</tt>, en spécifiant la version à utiliser comme précédemment, et on lit les informations sérialisées vers la structure de données <tt>contacts</tt>. Notez qu'on purge <tt>contacts</tt> avant d'y mettre les informations lues afin de simplifier le processus de lecture de fichier. Une façon plus avancée de procéder serait de lire les contacts dans un objet <a href="qmap.html">QMap</a> temporaire, et de copier uniquement les contacts n'existant pas encore dans <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>Pour afficher les contacts lus depuis le fichier, on doit d'abord valider les données obtenues afin de s'assurer que le fichier lu contient effectivement des entrées de carnet d'adresses. Si c'est le cas, on affiche le premier contact; sinon on informe l'utilisateur du problème par une <a href="qmessagebox.html">QMessageBox</a>. Enfin, on met à jour l'interface afin d'activer et de désactiver les boutons de façon appropriée.</p>
</div>
<!-- @@@tutorials/addressbook-fr/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>