Viadeo Twitter Google Bookmarks ! Facebook Digg del.icio.us MySpace Yahoo MyWeb Blinklist Netvouz Reddit Simpy StumbleUpon Bookmarks Windows Live Favorites 
Logo Documentation Qt ·  Page d'accueil  ·  Toutes les classes  ·  Classes principales  ·  Annotées  ·  Classes groupées  ·  Fonctions  · 

Outliner to show use of DOM

This example presents a small outliner program to show the basic usage of the DOM classes. The format of the outlines is the OPML format as described in http://www.opml.org/spec.

This example shows how to load a DOM tree from an XML file and how to traverse it.


Sample XML file (todos.opml):

<?xml version="1.0" encoding="ISO-8859-1"?>
<opml version="1.0">
    <head>
        <title>Todo List</title>
        <dateCreated>Tue, 31 Oct 2000 17:00:17 CET</dateCreated>
        <dateModified>Tue, 31 Oct 2000 17:00:17 CET</dateModified>
        <ownerName>Arthur Dent</ownerName>
        <ownerEmail>info@trolltech.com</ownerEmail>
    </head>
    <body>
        <outline text="Background">
            <outline text="This is an example todo list."/>
        </outline>
        <outline text="Books to read">
            <outline text="Science Fiction">
                <outline text="Philip K. Dick">
                    <outline text="Do Androids Dream of Electical Sheep?"/>
                    <outline text="The Three Stigmata of Palmer Eldritch"/>
                </outline>
                <outline text="Robert A. Heinlein">
                    <outline text="Stranger in a Strange Land"/>
                </outline>
                <outline text="Isaac Asimov">
                    <outline text="Foundation and Empire"/>
                </outline>
            </outline>
            <outline text="Qt Books (in English)">
                <outline text="Blanchette &amp; Summerfield: C++ GUI Programming with Qt 3"/>
                <outline text="Dalheimer: Programming with Qt"/>
                <outline text="Griffith: KDE 2/Qt Programming Bible"/>
                <outline text="Hughes: Linux Rapid Application Development"/>
                <outline text="Solin: Qt Programming in 24 hours"/>
                <outline text="Ward: Qt 2 Programming for Linux and Windows 2000"/>
            </outline>
        </outline>
        <outline text="Shopping list">
            <outline text="General">
                <outline text="Towel"/>
                <outline text="Hair dryer"/>
                <outline text="Underpants"/>
            </outline>
            <outline text="For Sunday">
                <outline text="Beef"/>
                <outline text="Rice"/>
                <outline text="Carrots"/>
                <outline text="Beans"/>
                <outline text="Beer"/>
                <outline text="Wine"/>
                <outline text="Orange juice"/>
            </outline>
        </outline>
        <outline text="Write a letter to Ford">
        </outline>
    </body>
</opml>


Header file (outlinetree.h):

/****************************************************************************
** $Id: qt/outlinetree.h   3.3.7   edited Aug 31 2005 $
**
** Copyright (C) 1992-2005 Trolltech AS.  All rights reserved.
**
** This file is part of an example program for Qt.  This example
** program may be used, distributed and modified without limitation.
**
*****************************************************************************/

#ifndef OUTLINETREE_H
#define OUTLINETREE_H

#include <qlistview.h>
#include <qdom.h>

class OutlineTree : public QListView
{
    Q_OBJECT

public:
    OutlineTree( const QString fileName, QWidget *parent = 0, const char *name = 0 );
    ~OutlineTree();

private:
    QDomDocument domTree;
    void getHeaderInformation( const QDomElement &header );
    void buildTree( QListViewItem *parentItem, const QDomElement &parentElement );
};

#endif // OUTLINETREE_H


Implementation (outlinetree.cpp):

/****************************************************************************
** $Id: qt/outlinetree.cpp   3.3.7   edited Aug 31 2005 $
**
** Copyright (C) 1992-2005 Trolltech AS.  All rights reserved.
**
** This file is part of an example program for Qt.  This example
** program may be used, distributed and modified without limitation.
**
*****************************************************************************/

#include "outlinetree.h"
#include <qfile.h>
#include <qmessagebox.h>

OutlineTree::OutlineTree( const QString fileName, QWidget *parent, const char *name )
    : QListView( parent, name )
{
    // div. configuration of the list view
    addColumn( "Outlines" );
    setSorting( -1 );
    setRootIsDecorated( TRUE );

    // read the XML file and create DOM tree
    QFile opmlFile( fileName );
    if ( !opmlFile.open( IO_ReadOnly ) ) {
        QMessageBox::critical( 0,
                tr( "Critical Error" ),
                tr( "Cannot open file %1" ).arg( fileName ) );
        return;
    }
    if ( !domTree.setContent( &opmlFile ) ) {
        QMessageBox::critical( 0,
                tr( "Critical Error" ),
                tr( "Parsing error for file %1" ).arg( fileName ) );
        opmlFile.close();
        return;
    }
    opmlFile.close();

    // get the header information from the DOM
    QDomElement root = domTree.documentElement();
    QDomNode node;
    node = root.firstChild();
    while ( !node.isNull() ) {
        if ( node.isElement() && node.nodeName() == "head" ) {
            QDomElement header = node.toElement();
            getHeaderInformation( header );
            break;
        }
        node = node.nextSibling();
    }
    // create the tree view out of the DOM
    node = root.firstChild();
    while ( !node.isNull() ) {
        if ( node.isElement() && node.nodeName() == "body" ) {
            QDomElement body = node.toElement();
            buildTree( 0, body );
            break;
        }
        node = node.nextSibling();
    }
}

OutlineTree::~OutlineTree()
{
}

void OutlineTree::getHeaderInformation( const QDomElement &header )
{
    // visit all children of the header element and look if you can make
    // something with it
    QDomNode node = header.firstChild();
    while ( !node.isNull() ) {
        if ( node.isElement() ) {
            // case for the different header entries
            if ( node.nodeName() == "title" ) {
                QDomText textChild = node.firstChild().toText();
                if ( !textChild.isNull() ) {
                    setColumnText( 0, textChild.nodeValue() );
                }
            }
        }
        node = node.nextSibling();
    }
}

void OutlineTree::buildTree( QListViewItem *parentItem, const QDomElement &parentElement )
{
    QListViewItem *thisItem = 0;
    QDomNode node = parentElement.firstChild();
    while ( !node.isNull() ) {
        if ( node.isElement() && node.nodeName() == "outline" ) {
            // add a new list view item for the outline
            if ( parentItem == 0 )
                thisItem = new QListViewItem( this, thisItem );
            else
                thisItem = new QListViewItem( parentItem, thisItem );
            thisItem->setText( 0, node.toElement().attribute( "text" ) );
            // recursive build of the tree
            buildTree( thisItem, node.toElement() );
        }
        node = node.nextSibling();
    }
}


Main (main.cpp):

/****************************************************************************
** $Id: qt/main.cpp   3.3.7   edited Aug 31 2005 $
**
** Copyright (C) 1992-2005 Trolltech AS.  All rights reserved.
**
** This file is part of an example program for Qt.  This example
** program may be used, distributed and modified without limitation.
**
*****************************************************************************/

#include <qapplication.h>
#include "outlinetree.h"

int main( int argc, char **argv )
{
    QApplication a( argc, argv );

    OutlineTree outline( "todos.opml" );
    a.setMainWidget( &outline );
    outline.show();

    return a.exec();
}

See also Qt XML Examples.

Publicité

Best Of

Actualités les plus lues

Semaine
Mois
Année

Le Qt Developer Network au hasard

Logo

Utiliser QML et QtWebKit avec PySide

Le Qt Developer Network est un réseau de développeurs Qt anglophone, où ils peuvent partager leur expérience sur le framework. Lire l'article.

Communauté

Ressources

Liens utiles

Contact

  • Vous souhaitez rejoindre la rédaction ou proposer un tutoriel, une traduction, une question... ? Postez dans le forum Contribuez ou contactez-nous par MP ou par email (voir en bas de page).

Qt dans le magazine

Cette page est une traduction d'une page de la documentation de Qt, écrite par Nokia Corporation and/or its subsidiary(-ies). Les éventuels problèmes résultant d'une mauvaise traduction ne sont pas imputables à Nokia. Qt 3.3
Copyright © 2012 Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon, vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts. Cette page est déposée à la SACD.
Vous avez déniché une erreur ? Un bug ? Une redirection cassée ? Ou tout autre problème, quel qu'il soit ? Ou bien vous désirez participer à ce projet de traduction ? N'hésitez pas à nous contacter ou par MP !
 
 
 
 
Partenaires

Hébergement Web