Home | All Classes | Main Classes | Annotated | Grouped Classes | Functions |

# Simple Filemanager

This example implements a simple and not fully functional file manager using a widget derived from QIconView to display the current directory. To display the directory tree the widget written in the dirview example is used.

Header file of the file icon view:

    /****************************************************************************
    ** $Id: qt/qfileiconview.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 QTFILEICONVIEW_H
    #define QTFILEICONVIEW_H

    #include <qiconset.h>
    #include <qstring.h>
    #include <qfileinfo.h>
    #include <qdir.h>
    #include <qtimer.h>
    #include <qiconview.h>

    class QtFileIconView;
    class QDragObject;
    class QResizeEvent;

    /*****************************************************************************
     *
     * Class QtFileIconDrag
     *
     *****************************************************************************/

    class QtFileIconDrag : public QIconDrag
    {
        Q_OBJECT

    public:
        QtFileIconDrag( QWidget * dragSource, const char* name = 0 );

        const char* format( int i ) const;
        QByteArray encodedData( const char* mime ) const;
        static bool canDecode( QMimeSource* e );
        void append( const QIconDragItem &item, const QRect &pr, const QRect &tr, const QString &url );

    private:
        QStringList urls;

    };

    /*****************************************************************************
     *
     * Class QtFileIconView
     *
     *****************************************************************************/
    class QtFileIconViewItem;
    class QtFileIconView : public QIconView
    {
        Q_OBJECT

    public:
        QtFileIconView( const QString &dir, QWidget *parent = 0, const char *name = 0 );

        enum ViewMode { Large, Small };

        void setViewMode( ViewMode m );
        ViewMode viewMode() const { return vm; }
        void setOpenItem( QtFileIconViewItem *i ) {
            openItem = i;
        }

    public slots:
        void setDirectory( const QString &dir );
        void setDirectory( const QDir &dir );
        void newDirectory();
        QDir currentDir();

    signals:
        void directoryChanged( const QString & );
        void startReadDir( int dirs );
        void readNextDir();
        void readDirDone();
        void enableUp();
        void disableUp();
        void enableMkdir();
        void disableMkdir();

    protected slots:
        void itemDoubleClicked( QIconViewItem *i );
        void slotDropped( QDropEvent *e, const QValueList<QIconDragItem> & );

        void viewLarge();
        void viewSmall();
        void viewBottom();
        void viewRight();
        void flowEast();
        void flowSouth();
        void itemTextTruncate();
        void itemTextWordWrap();
        void sortAscending();
        void sortDescending();
        void arrangeItemsInGrid() {
            QIconView::arrangeItemsInGrid( TRUE );
        }

        void slotRightPressed( QIconViewItem *item );
        void openFolder();

    protected:
        void readDir( const QDir &dir );
        virtual QDragObject *dragObject();

        virtual void keyPressEvent( QKeyEvent *e );

        QDir viewDir;
        int newFolderNum;
        QSize sz;
        QPixmap pix;
        ViewMode vm;
        QtFileIconViewItem *openItem;

    };

    /*****************************************************************************
     *
     * Class QtFileIconViewItem
     *
     *****************************************************************************/

    class QtFileIconViewItem : public QIconViewItem
    {
        friend class QtFileIconView;

    public:
        enum ItemType {
            File = 0,
            Dir,
            Link
        };

        QtFileIconViewItem( QtFileIconView *parent, QFileInfo *fi );

        virtual ~QtFileIconViewItem();

        ItemType type() const
        { return itemType; }
        QString filename() const { return itemFileName; }

        virtual bool acceptDrop( const QMimeSource *e ) const;

        virtual void setText( const QString &text );
        virtual QPixmap *pixmap() const;

        virtual void dragEntered();
        virtual void dragLeft();

        void viewModeChanged( QtFileIconView::ViewMode m );
        void paintItem( QPainter *p, const QColorGroup &cg );

    protected:
        virtual void dropped( QDropEvent *e, const QValueList<QIconDragItem> & );

        QString itemFileName;
        QFileInfo *itemFileInfo;
        ItemType itemType;
        bool checkSetText;
        QTimer timer;
        QtFileIconView::ViewMode vm;

    };

    #endif

Implementation of the file icon view:

    /****************************************************************************
    ** $Id: qt/qfileiconview.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 "qfileiconview.h"
    #include <qpainter.h>
    #include <qstringlist.h>
    #include <qpixmap.h>
    #include <qmime.h>
    #include <qstrlist.h>
    #include <qdragobject.h>
    #include <qmessagebox.h>
    #include <qevent.h>
    #include <qpopupmenu.h>
    #include <qcursor.h>
    #include <qapplication.h>
    #include <qwmatrix.h>

    #include <stdlib.h>

    static const char * file_icon[]={
        "32 32 17 1",
        "# c #000000",
        "a c #ffffff",
        "j c #808080",
        "n c #a0a0a4",
        "g c #c0c0c0",
        "m c #004000",
        "o c #000000",
        "l c #004040",
        "k c #404000",
        "i c #c0c000",
        "h c #ffff00",
        "b c #ffffc0",
        "e c #ff8000",
        "f c #c05800",
        "c c #ffa858",
        "d c #ffdca8",
        ". c None",
        "................................",
        "................................",
        "................................",
        "................................",
        ".............#....###...........",
        "...###......#a##.#aba##.........",
        "..#cdb#....#aaaa#aaaaaa##.......",
        "..#ecdb#..#aaaa#aaaaaaaba##.....",
        "..#fecdb##aaaa#aaaaaaaaaaab##...",
        "...#fecdb#aaa#aaaaaaabaabaaaa##.",
        "....#fecdb#a#baaaaa#baaaaaabaaa#",
        ".....#fecdb#aaaaab#a##baaaaaaa#.",
        ".....##fecdb#bbba#aaaa##baaab#..",
        "....#bb#fecdb#ba#aaaaaaa##aa#...",
        "...#bbbb#fecdb##aaabaaaaaa##....",
        "..#bbbb#b#fecdb#aaaaaaabaaaa##..",
        ".#bbbb#bbb#fecdg#aaaaaaaaaaaba#.",
        "#hhbb#bbbbb#fegg#iiaaaaaaaaaaaa#",
        "#jhhhklibbbk#ggj#aaiiaaaaaaaaa#j",
        ".#mjhhhkmikab####aaabiiaaaaaa#j.",
        "...##jhhhmaaibbaaiibaaaiiaab#n..",
        ".....##j#baaaiiabaaiibaabaa#n...",
        "......##baibaabiibaaaiiabb#j....",
        "......#bbbbiiaabbiiaaaaabon.....",
        ".....#bbbbbbbiiabbaiiaab#n......",
        ".....#jbbbbbbbbiibaabba#n.......",
        "......##jbbbbbbbbiiaabmj........",
        "........##jbbbbbbbbbb#j.........",
        "..........##nbbbbbbbmj..........",
        "............##jbbbb#j...........",
        "..............#mjj#n............",
        "................##n............."};

    static const char * folder_icon[]={
        "32 32 11 1",
        "# c #000000",
        "b c #c0c000",
        "d c #585858",
        "a c #ffff00",
        "i c #400000",
        "h c #a0a0a4",
        "e c #000000",
        "c c #ffffff",
        "f c #303030",
        "g c #c0c0c0",
        ". c None",
        "...###..........................",
        "...#aa##........................",
        ".###baaa##......................",
        ".#cde#baaa##....................",
        ".#cccdeebaaa##..##f.............",
        ".#cccccdeebaaa##aaa##...........",
        ".#cccccccdeebaaaaaaaa##.........",
        ".#cccccccccdeebababaaa#.........",
        ".#cccccgcgghhebbbbbbbaa#........",
        ".#ccccccgcgggdebbbbbbba#........",
        ".#cccgcgcgcgghdeebiebbba#.......",
        ".#ccccgcggggggghdeddeeba#.......",
        ".#cgcgcgcggggggggghghdebb#......",
        ".#ccgcggggggggghghghghd#b#......",
        ".#cgcgcggggggggghghghhd#b#......",
        ".#gcggggggggghghghhhhhd#b#......",
        ".#cgcggggggggghghghhhhd#b#......",
        ".#ggggggggghghghhhhhhhdib#......",
        ".#gggggggggghghghhhhhhd#b#......",
        ".#hhggggghghghhhhhhhhhd#b#......",
        ".#ddhhgggghghghhhhhhhhd#b#......",
        "..##ddhhghghhhhhhhhhhhdeb#......",
        "....##ddhhhghhhhhhhhhhd#b#......",
        "......##ddhhhhhhhhhhhhd#b#......",
        "........##ddhhhhhhhhhhd#b#......",
        "..........##ddhhhhhhhhd#b#......",
        "............##ddhhhhhhd#b###....",
        "..............##ddhhhhd#b#####..",
        "................##ddhhd#b######.",
        "..................##dddeb#####..",
        "....................##d#b###....",
        "......................####......"};

    static const char * link_icon[]={
        "32 32 12 1",
        "# c #000000",
        "h c #a0a0a4",
        "b c #c00000",
        "d c #585858",
        "i c #400000",
        "c c #ffffff",
        "e c #000000",
        "g c #c0c0c0",
        "a c #ff0000",
        "f c #303030",
        "n c white",
        ". c None",
        "...###..........................",
        "...#aa##........................",
        ".###baaa##......................",
        ".#cde#baaa##....................",
        ".#cccdeebaaa##..##f.............",
        ".#cccccdeebaaa##aaa##...........",
        ".#cccccccdeebaaaaaaaa##.........",
        ".#cccccccccdeebababaaa#.........",
        ".#cccccgcgghhebbbbbbbaa#........",
        ".#ccccccgcgggdebbbbbbba#........",
        ".#cccgcgcgcgghdeebiebbba#.......",
        ".#ccccgcggggggghdeddeeba#.......",
        ".#cgcgcgcggggggggghghdebb#......",
        ".#ccgcggggggggghghghghd#b#......",
        ".#cgcgcggggggggghghghhd#b#......",
        ".#gcggggggggghghghhhhhd#b#......",
        ".#cgcggggggggghghghhhhd#b#......",
        ".#ggggggggghghghhhhhhhdib#......",
        ".#gggggggggghghghhhhhhd#b#......",
        ".#hhggggghghghhhhhhhhhd#b#......",
        ".#ddhhgggghghghhhhhhhhd#b#......",
        "..##ddhhghghhhhhhhhhhhdeb#......",
        "############hhhhhhhhhhd#b#......",
        "#nnnnnnnnnn#hhhhhhhhhhd#b#......",
        "#nnnnnnnnnn#hhhhhhhhhhd#b#......",
        "#nn#nn#nnnn#ddhhhhhhhhd#b#......",
        "#nn##n##nnn###ddhhhhhhd#b###....",
        "#nnn#####nn#..##ddhhhhd#b#####..",
        "#nnnnn##nnn#....##ddhhd#b######.",
        "#nnnnn#nnnn#......##dddeb#####..",
        "#nnnnnnnnnn#........##d#b###....",
        "############..........####......"};

    static const char * folder_locked_icon[]={
        "32 32 12 1",
        "# c #000000",
        "g c #808080",
        "h c #c0c0c0",
        "f c #c05800",
        "c c #ffffff",
        "d c #585858",
        "b c #ffa858",
        "a c #ffdca8",
        "e c #000000",
        "i c #a0a0a4",
        "j c #c0c0c0",
        ". c None",
        "...###..........................",
        "...#aa##........................",
        ".###baaa##......................",
        ".#cde#baaa##....................",
        ".#cccdeeba#######...............",
        ".#cccccde##fffff##..............",
        ".#cccccc##fffgggg#..............",
        ".#ccccccc#ffg####a##............",
        ".#ccccchc#ffg#eebbaa##..........",
        ".#ccccccc#ffg#ddeebbba##........",
        ".#ccchccc#ffg#ihddeebbba##......",
        ".#cccccaa#ffg#ihhhddeeba##......",
        ".#chchhbbaafg#ihhhihidebb#......",
        ".#cchccbbbbaa#ihhihihid#b#......",
        ".#chchhbb#bbbaaiihihiid#b#......",
        ".#hchhcbb#fbbbafhiiiiid#b#......",
        ".#chchhbb#ffgbbfihiiiid#b#......",
        ".#hhhhhbb#ffg#bfiiiiiid#b#......",
        ".#hhhhhbbaffg#bfiiiiiid#b#......",
        ".#iihhhjbbaab#bfiiiiiid#b#......",
        ".#ddiihhh#bbbabfiiiiiid#b#......",
        "..##ddiih#ffbbbfiiiiiid#b#......",
        "....##ddi#ffg#biiiiiiid#b#......",
        "......##d#ffg#iiiiiiiid#b#......",
        "........##ffg#iiiiiiiid#b#......",
        ".........#ffg#iiiiiiiid#b#......",
        ".........#ffg#ddiiiiiid#b###....",
        ".........##fg###ddiiiid#b#####..",
        "...........####.##ddiid#b######.",
        "..................##dddeb#####..",
        "....................##d#b###....",
        "......................####......"};

    static QPixmap *iconFolderLockedLarge = 0;
    static QPixmap *iconFolderLarge = 0;
    static QPixmap *iconFileLarge = 0;
    static QPixmap *iconLinkLarge = 0;
    static QPixmap *iconFolderLockedSmall = 0;
    static QPixmap *iconFolderSmall = 0;
    static QPixmap *iconFileSmall = 0;
    static QPixmap *iconLinkSmall = 0;

    static void cleanup()
    {
        delete iconFolderLockedLarge;
        iconFolderLockedLarge = 0;
        delete iconFolderLarge;
        iconFolderLarge = 0;
        delete iconFileLarge;
        iconFileLarge = 0;
        delete iconLinkLarge;
        iconLinkLarge = 0;
        delete iconFolderLockedSmall;
        iconFolderLockedSmall = 0;
        delete iconFolderSmall;
        iconFolderSmall = 0;
        delete iconFileSmall;
        iconFileSmall = 0;
        delete iconLinkSmall;
        iconLinkSmall = 0;
    }

    /*****************************************************************************
     *
     * Class QtFileIconDrag
     *
     *****************************************************************************/

    QtFileIconDrag::QtFileIconDrag( QWidget * dragSource, const char* name )
        : QIconDrag( dragSource, name )
    {
    }

    const char* QtFileIconDrag::format( int i ) const
    {
        if ( i == 0 )
            return "application/x-qiconlist";
        else if ( i == 1 )
            return "text/uri-list";
        else
            return 0;
    }

    QByteArray QtFileIconDrag::encodedData( const char* mime ) const
    {
        QByteArray a;
        if ( QString( mime ) == "application/x-qiconlist" ) {
            a = QIconDrag::encodedData( mime );
        } else if ( QString( mime ) == "text/uri-list" ) {
            QString s = urls.join( "\r\n" );
            a.resize( s.length() );
            memcpy( a.data(), s.latin1(), s.length() );
        }
        return a;
    }

    bool QtFileIconDrag::canDecode( QMimeSource* e )
    {
        return e->provides( "application/x-qiconlist" ) ||
            e->provides( "text/uri-list" );
    }

    void QtFileIconDrag::append( const QIconDragItem &item, const QRect &pr,
                                 const QRect &tr, const QString &url )
    {
        QIconDrag::append( item, pr, tr );
        QString ourUrl = url;
    #ifdef Q_WS_WIN
        if (ourUrl.length() > 2 && ourUrl[1] != ':') {
            QDir dir(ourUrl);
            ourUrl = dir.absPath();
        }
    #endif
        urls << QUriDrag::localFileToUri(ourUrl);
    }

    /*****************************************************************************
     *
     * Class QtFileIconViewItem
     *
     *****************************************************************************/

    QtFileIconViewItem::QtFileIconViewItem( QtFileIconView *parent, QFileInfo *fi )
        : QIconViewItem( parent, fi->fileName() ), itemFileName( fi->filePath() ),
          itemFileInfo( fi ), checkSetText( FALSE )
    {
        vm = QtFileIconView::Large;

        if ( itemFileInfo->isDir() )
            itemType = Dir;
        else if ( itemFileInfo->isFile() )
            itemType = File;
        if ( itemFileInfo->isSymLink() )
            itemType = Link;

        viewModeChanged( ( (QtFileIconView*)iconView() )->viewMode() );

        if ( itemFileInfo->fileName() == "." ||
             itemFileInfo->fileName() == ".." )
            setRenameEnabled( FALSE );

        checkSetText = TRUE;

        QObject::connect( &timer, SIGNAL( timeout() ),
                          iconView(), SLOT( openFolder() ) );
    }

    void QtFileIconViewItem::paintItem( QPainter *p, const QColorGroup &cg )
    {
        if ( itemFileInfo->isSymLink() ) {
            QFont f( p->font() );
            f.setItalic( TRUE );
            p->setFont( f );
        }

        QIconViewItem::paintItem( p, cg );
    }

    void QtFileIconViewItem::viewModeChanged( QtFileIconView::ViewMode m )
    {
        vm = m;
        setDropEnabled( itemType == Dir && QDir( itemFileName ).isReadable() );
        calcRect();
    }

    QPixmap *QtFileIconViewItem::pixmap() const
    {
        switch ( itemType ) {
        case Dir:
            {
                if ( !QDir( itemFileName ).isReadable() ) {
                    if ( vm == QtFileIconView::Small )
                        return iconFolderLockedSmall;
                    else
                        return iconFolderLockedLarge;
                } else {
                    if ( vm == QtFileIconView::Small )
                        return iconFolderSmall;
                    else
                        return iconFolderLarge;
                }
            }
        case Link:
            {
                if ( vm == QtFileIconView::Small )
                    return iconLinkSmall;
                else
                    return iconLinkLarge;
            }
        default:
            {
                if ( vm == QtFileIconView::Small )
                    return iconFileSmall;
                else
                    return iconFileLarge;
            }
        }
    }

    QtFileIconViewItem::~QtFileIconViewItem()
    {
        delete itemFileInfo;
    }

    void QtFileIconViewItem::setText( const QString &text )
    {
        if ( checkSetText ) {
            if ( text == "." || text == "." || text.isEmpty() )
                return;
            QDir dir( itemFileInfo->dir() );
            if ( dir.rename( itemFileInfo->fileName(), text ) ) {
                itemFileName = itemFileInfo->dirPath( TRUE ) + "/" + text;
                delete itemFileInfo;
                itemFileInfo = new QFileInfo( itemFileName );
                QIconViewItem::setText( text );
            }
        } else {
            QIconViewItem::setText( text );
        }
    }

    bool QtFileIconViewItem::acceptDrop( const QMimeSource *e ) const
    {
        if ( type() == Dir && e->provides( "text/uri-list" ) &&
             dropEnabled() )
            return TRUE;

        return FALSE;
    }

    void QtFileIconViewItem::dropped( QDropEvent *e, const QValueList<QIconDragItem> & )
    {
        timer.stop();

        if ( !QUriDrag::canDecode( e ) ) {
            e->ignore();
            return;
        }

        QStringList lst;
        QUriDrag::decodeLocalFiles( e, lst );

        QString str;
        if ( e->action() == QDropEvent::Copy )
            str = "Copy\n\n";
        else
            str = "Move\n\n";
        for ( uint i = 0; i < lst.count(); ++i )
            str += QString( "   %1\n" ).arg( lst[i] );
        str += QString( "\n"
            "To\n\n"
            "       %1" ).arg( filename() );

        QMessageBox::information( iconView(), e->action() == QDropEvent::Copy ? "Copy" : "Move" , str, "Not Implemented" );
        if ( e->action() == QDropEvent::Move )
            QMessageBox::information( iconView(), "Remove" , str, "Not Implemented" );
        e->acceptAction();
    }

    void QtFileIconViewItem::dragEntered()
    {
        if ( type() != Dir ||
             type() == Dir && !QDir( itemFileName ).isReadable() )
            return;

        ( (QtFileIconView*)iconView() )->setOpenItem( this );
        timer.start( 1500 );
    }

    void QtFileIconViewItem::dragLeft()
    {
        if ( type() != Dir ||
             type() == Dir && !QDir( itemFileName ).isReadable() )
            return;

        timer.stop();
    }

    /*****************************************************************************
     *
     * Class QtFileIconView
     *
     *****************************************************************************/

    QtFileIconView::QtFileIconView( const QString &dir, QWidget *parent, const char *name )
        : QIconView( parent, name ), viewDir( dir ), newFolderNum( 0 )
    {
        if ( !iconFolderLockedLarge ) {
            qAddPostRoutine( cleanup );
            QWMatrix m;
            m.scale( 0.6, 0.6 );
            QPixmap iconpix( folder_locked_icon );
            iconFolderLockedLarge = new QPixmap( folder_locked_icon );
            iconpix = iconpix.xForm( m );
            iconFolderLockedSmall = new QPixmap( iconpix );
            iconpix = QPixmap( folder_icon );
            iconFolderLarge = new QPixmap( folder_icon );
            iconpix = iconpix.xForm( m );
            iconFolderSmall = new QPixmap( iconpix );
            iconpix = QPixmap( file_icon );
            iconFileLarge = new QPixmap( file_icon );
            iconpix = iconpix.xForm( m );
            iconFileSmall = new QPixmap( iconpix );
            iconpix = QPixmap( link_icon );
            iconLinkLarge = new QPixmap( link_icon );
            iconpix = iconpix.xForm( m );
            iconLinkSmall = new QPixmap( iconpix );
        }

        vm = Large;

        setGridX( 75 );
        setResizeMode( Adjust );
        setWordWrapIconText( FALSE );

        connect( this, SIGNAL( doubleClicked( QIconViewItem * ) ),
                 this, SLOT( itemDoubleClicked( QIconViewItem * ) ) );
        connect( this, SIGNAL( returnPressed( QIconViewItem * ) ),
                 this, SLOT( itemDoubleClicked( QIconViewItem * ) ) );
        connect( this, SIGNAL( dropped( QDropEvent *, const QValueList<QIconDragItem> & ) ),
                 this, SLOT( slotDropped( QDropEvent *, const QValueList<QIconDragItem> & ) ) );
        connect( this, SIGNAL( contextMenuRequested( QIconViewItem *, const QPoint & ) ),
                 this, SLOT( slotRightPressed( QIconViewItem * ) ) );

        setHScrollBarMode( AlwaysOff );
        setVScrollBarMode( Auto );

        setAutoArrange( TRUE );
        setSorting( TRUE );
        openItem = 0;
    }

    void QtFileIconView::openFolder()
    {
        if ( !openItem )
            return;
        if ( openItem->type() != QtFileIconViewItem::Dir ||
             openItem->type() == QtFileIconViewItem::Dir &&
             !QDir( openItem->itemFileName ).isReadable() )
            return;

        openItem->timer.stop();
        setDirectory( openItem->itemFileName );
    }

    void QtFileIconView::setDirectory( const QString &dir )
    {
        viewDir = QDir( dir );
        readDir( viewDir );
    }

    void QtFileIconView::setDirectory( const QDir &dir )
    {
        viewDir = dir;
        readDir( viewDir );
    }

    void QtFileIconView::newDirectory()
    {
        setAutoArrange( FALSE );
        selectAll( FALSE );
        if ( viewDir.mkdir( QString( "New Folder %1" ).arg( ++newFolderNum ) ) ) {
            QFileInfo *fi = new QFileInfo( viewDir, QString( "New Folder %1" ).arg( newFolderNum ) );
            QtFileIconViewItem *item = new QtFileIconViewItem( this, new QFileInfo( *fi ) );
            item->setKey( QString( "000000%1" ).arg( fi->fileName() ) );
            delete fi;
            repaintContents( contentsX(), contentsY(), contentsWidth(), contentsHeight(), FALSE );
            ensureItemVisible( item );
            item->setSelected( TRUE, TRUE );
            setCurrentItem( item );
            repaintItem( item );
            qApp->processEvents();
            item->rename();
        }
        setAutoArrange( TRUE );
    }

    QDir QtFileIconView::currentDir()
    {
        return viewDir;
    }

    static bool isRoot( const QString &s )
    {
    #if defined(Q_OS_UNIX)
        if ( s == "/" )
            return TRUE;
    #elif defined(Q_OS_WIN32)
        QString p = s;
        if ( p.length() == 3 &&
             p.right( 2 ) == ":/" )
            return TRUE;
        if ( p[ 0 ] == '/' && p[ 1 ] == '/' ) {
            int slashes = p.contains( '/' );
            if ( slashes <= 3 )
                return TRUE;
            if ( slashes == 4 && p[ (int)p.length() - 1 ] == '/' )
                return TRUE;
        }
    #endif

        return FALSE;
    }

    void QtFileIconView::readDir( const QDir &dir )
    {
        if ( !dir.isReadable() )
            return;

        if ( isRoot( dir.absPath() ) )
            emit disableUp();
        else
            emit enableUp();

        clear();

        emit directoryChanged( dir.absPath() );

        const QFileInfoList *filist = dir.entryInfoList( QDir::DefaultFilter, QDir::DirsFirst | QDir::Name );

        emit startReadDir( filist->count() );

        QFileInfoListIterator it( *filist );
        QFileInfo *fi;
        bool allowRename = FALSE, allowRenameSet = FALSE;
        while ( ( fi = it.current() ) != 0 ) {
            ++it;
            if ( fi && fi->fileName() == ".." && ( fi->dirPath() == "/" || fi->dirPath().isEmpty() ) )
                continue;
            emit readNextDir();
            QtFileIconViewItem *item = new QtFileIconViewItem( this, new QFileInfo( *fi ) );
            if ( fi->isDir() )
                item->setKey( QString( "000000%1" ).arg( fi->fileName() ) );
            else
                item->setKey( fi->fileName() );
            if ( !allowRenameSet ) {
                if ( !QFileInfo( fi->absFilePath() ).isWritable() ||
                     item->text() == "." || item->text() == ".." )
                    allowRename = FALSE;
                else
                    allowRename = TRUE;
                if ( item->text() == "." || item->text() == ".." )
                    allowRenameSet = FALSE;
                else
                    allowRenameSet = TRUE;
            }
            item->setRenameEnabled( allowRename );
        }

        if ( !QFileInfo( dir.absPath() ).isWritable() )
            emit disableMkdir();
        else
            emit enableMkdir();

        emit readDirDone();
    }

    void QtFileIconView::itemDoubleClicked( QIconViewItem *i )
    {
        QtFileIconViewItem *item = ( QtFileIconViewItem* )i;

        if ( item->type() == QtFileIconViewItem::Dir ) {
            viewDir = QDir( item->filename() );
            readDir( viewDir );
        } else if ( item->type() == QtFileIconViewItem::Link &&
                    QFileInfo( QFileInfo( item->filename() ).readLink() ).isDir() ) {
            viewDir = QDir( QFileInfo( item->filename() ).readLink() );
            readDir( viewDir );
        }
    }

    QDragObject *QtFileIconView::dragObject()
    {
        if ( !currentItem() )
            return 0;

        QPoint orig = viewportToContents( viewport()->mapFromGlobal( QCursor::pos() ) );
        QtFileIconDrag *drag = new QtFileIconDrag( viewport() );
        drag->setPixmap( *currentItem()->pixmap(),
                         QPoint( currentItem()->pixmapRect().width() / 2, currentItem()->pixmapRect().height() / 2 ) );
        for ( QtFileIconViewItem *item = (QtFileIconViewItem*)firstItem(); item;
              item = (QtFileIconViewItem*)item->nextItem() ) {
            if ( item->isSelected() ) {
                QIconDragItem id;
                id.setData( QCString( item->filename() ) );
                drag->append( id,
                              QRect( item->pixmapRect( FALSE ).x() - orig.x(),
                                     item->pixmapRect( FALSE ).y() - orig.y(),
                                     item->pixmapRect().width(), item->pixmapRect().height() ),
                              QRect( item->textRect( FALSE ).x() - orig.x(),
                                     item->textRect( FALSE ).y() - orig.y(),
                                     item->textRect().width(), item->textRect().height() ),
                              QString( item->filename() ) );
            }
        }

        return drag;
    }

    void QtFileIconView::keyPressEvent( QKeyEvent *e )
    {
        if ( e->key() == Key_N &&
             ( e->state() & ControlButton ) )
            newDirectory();
        else
            QIconView::keyPressEvent( e );
    }

    void QtFileIconView::slotDropped( QDropEvent *e, const QValueList<QIconDragItem> & )
    {
        if ( openItem )
            openItem->timer.stop();
        if ( !QUriDrag::canDecode( e ) ) {
            e->ignore();
            return;
        }

        QStringList lst;
        QUriDrag::decodeLocalFiles( e, lst );

        QString str;
        if ( e->action() == QDropEvent::Copy )
            str = "Copy\n\n";
        else
            str = "Move\n\n";
        for ( uint i = 0; i < lst.count(); ++i )
            str += QString( "   %1\n" ).arg( QDir::convertSeparators(lst[i]) );
        str += QString( "\n"
            "To\n\n"
            "       %1" ).arg( viewDir.absPath() );

        QMessageBox::information( this, e->action() == QDropEvent::Copy ? "Copy" : "Move" , str, "Not Implemented" );
        if ( e->action() == QDropEvent::Move )
            QMessageBox::information( this, "Remove" , QDir::convertSeparators(lst.join("\n")), "Not Implemented" );
        e->acceptAction();
        openItem = 0;
    }

    void QtFileIconView::viewLarge()
    {
        setViewMode( Large );
    }

    void QtFileIconView::viewSmall()
    {
        setViewMode( Small );
    }

    void QtFileIconView::viewBottom()
    {
        setItemTextPos( Bottom );
    }

    void QtFileIconView::viewRight()
    {
        setItemTextPos( Right );
    }

    void QtFileIconView::flowEast()
    {
        setHScrollBarMode( AlwaysOff );
        setVScrollBarMode( Auto );
        setArrangement( LeftToRight );
    }

    void QtFileIconView::flowSouth()
    {
        setVScrollBarMode( AlwaysOff );
        setHScrollBarMode( Auto );
        setArrangement( TopToBottom );
    }

    void QtFileIconView::sortAscending()
    {
        sort( TRUE );
    }

    void QtFileIconView::sortDescending()
    {
        sort( FALSE );
    }

    void QtFileIconView::itemTextTruncate()
    {
        setWordWrapIconText( FALSE );
    }

    void QtFileIconView::itemTextWordWrap()
    {
        setWordWrapIconText( TRUE );
    }

    void QtFileIconView::slotRightPressed( QIconViewItem *item )
    {
        if ( !item ) { // right pressed on viewport
            QPopupMenu menu( this );

            menu.insertItem( "&Large view", this, SLOT( viewLarge() ) );
            menu.insertItem( "&Small view", this, SLOT( viewSmall() ) );
            menu.insertSeparator();
            menu.insertItem( "Text at the &bottom", this, SLOT( viewBottom() ) );
            menu.insertItem( "Text at the &right", this, SLOT( viewRight() ) );
            menu.insertSeparator();
            menu.insertItem( "Arrange l&eft to right", this, SLOT( flowEast() ) );
            menu.insertItem( "Arrange t&op to bottom", this, SLOT( flowSouth() ) );
            menu.insertSeparator();
            menu.insertItem( "&Truncate item text", this, SLOT( itemTextTruncate() ) );
            menu.insertItem( "&Wordwrap item text", this, SLOT( itemTextWordWrap() ) );
            menu.insertSeparator();
            menu.insertItem( "Arrange items in &grid", this, SLOT( arrangeItemsInGrid() ) );
            menu.insertSeparator();
            menu.insertItem( "Sort &ascending", this, SLOT( sortAscending() ) );
            menu.insertItem( "Sort &descending", this, SLOT( sortDescending() ) );

            menu.setMouseTracking( TRUE );
            menu.exec( QCursor::pos() );
        } else { // on item
            QPopupMenu menu( this );

            int RENAME_ITEM = menu.insertItem( "Rename Item" );
            int REMOVE_ITEM = menu.insertItem( "Remove Item" );

            menu.setMouseTracking( TRUE );
            int id = menu.exec( QCursor::pos() );

            if ( id == -1 )
                return;

            if ( id == RENAME_ITEM && item->renameEnabled() ) {
                item->rename();
            } else if ( id == REMOVE_ITEM ) {
                delete item;
                QMessageBox::information( this, "Not implemented!", "Deleting files not implemented yet,\n"
                                          "The item has only been removed from the view! " );
            }
        }
    }

    void QtFileIconView::setViewMode( ViewMode m )
    {
        if ( m == vm )
            return;

        vm = m;
        QtFileIconViewItem *item = (QtFileIconViewItem*)firstItem();
        for ( ; item; item = (QtFileIconViewItem*)item->nextItem() )
            item->viewModeChanged( vm );

        arrangeItemsInGrid();
    }

Header file of the main window:

    /****************************************************************************
    ** $Id: qt/mainwindow.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 MAINWIN_H
    #define MAINWIN_H

    #include <qmainwindow.h>

    class QtFileIconView;
    class DirectoryView;
    class QProgressBar;
    class QLabel;
    class QComboBox;
    class QToolButton;

    class FileMainWindow : public QMainWindow
    {
        Q_OBJECT

    public:
        FileMainWindow();

        QtFileIconView *fileView() { return fileview; }
        DirectoryView *dirList() { return dirlist; }

        void show();

    protected:
        void setup();
        void setPathCombo();

        QtFileIconView *fileview;
        DirectoryView *dirlist;
        QProgressBar *progress;
        QLabel *label;
        QComboBox *pathCombo;
        QToolButton *upButton, *mkdirButton;

    protected slots:
        void directoryChanged( const QString & );
        void slotStartReadDir( int dirs );
        void slotReadNextDir();
        void slotReadDirDone();
        void cdUp();
        void newFolder();
        void changePath( const QString &path );
        void enableUp();
        void disableUp();
        void enableMkdir();
        void disableMkdir();

    };

    #endif

Implementation of the main window:

    /****************************************************************************
    ** $Id: qt/mainwindow.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 "mainwindow.h"
    #include "qfileiconview.h"
    #include "../dirview/dirview.h"

    #include <qsplitter.h>
    #include <qprogressbar.h>
    #include <qlabel.h>
    #include <qstatusbar.h>
    #include <qtoolbar.h>
    #include <qcombobox.h>
    #include <qpixmap.h>
    #include <qtoolbutton.h>
    #include <qdir.h>
    #include <qfileinfo.h>

    static const char* cdtoparent_xpm[]={
        "15 13 3 1",
        ". c None",
        "* c #000000",
        "a c #ffff99",
        "..*****........",
        ".*aaaaa*.......",
        "***************",
        "*aaaaaaaaaaaaa*",
        "*aaaa*aaaaaaaa*",
        "*aaa***aaaaaaa*",
        "*aa*****aaaaaa*",
        "*aaaa*aaaaaaaa*",
        "*aaaa*aaaaaaaa*",
        "*aaaa******aaa*",
        "*aaaaaaaaaaaaa*",
        "*aaaaaaaaaaaaa*",
        "***************"};

    static const char* newfolder_xpm[] = {
        "15 14 4 1",
        "   c None",
        ".  c #000000",
        "+  c #FFFF00",
        "@  c #FFFFFF",
        "          .    ",
        "               ",
        "          .    ",
        "       .     . ",
        "  ....  . . .  ",
        " .+@+@.  . .   ",
        "..........  . .",
        ".@+@+@+@+@..   ",
        ".+@+@+@+@+. .  ",
        ".@+@+@+@+@.  . ",
        ".+@+@+@+@+.    ",
        ".@+@+@+@+@.    ",
        ".+@+@+@+@+.    ",
        "...........    "};

    FileMainWindow::FileMainWindow()
        : QMainWindow()
    {
        setup();
    }

    void FileMainWindow::show()
    {
        QMainWindow::show();
    }

    void FileMainWindow::setup()
    {
        QSplitter *splitter = new QSplitter( this );

        dirlist = new DirectoryView( splitter, "dirlist", TRUE );
        dirlist->addColumn( "Name" );
        dirlist->addColumn( "Type" );
        Directory *root = new Directory( dirlist, "/" );
        root->setOpen( TRUE );
        splitter->setResizeMode( dirlist, QSplitter::KeepSize );

        fileview = new QtFileIconView( "/", splitter );
        fileview->setSelectionMode( QIconView::Extended );

        setCentralWidget( splitter );

        QToolBar *toolbar = new QToolBar( this, "toolbar" );
        setRightJustification( TRUE );

        (void)new QLabel( tr( " Path: " ), toolbar );

        pathCombo = new QComboBox( TRUE, toolbar );
        pathCombo->setAutoCompletion( TRUE );
        toolbar->setStretchableWidget( pathCombo );
        connect( pathCombo, SIGNAL( activated( const QString & ) ),
                 this, SLOT ( changePath( const QString & ) ) );

        toolbar->addSeparator();

        QPixmap pix;

        pix = QPixmap( cdtoparent_xpm );
        upButton = new QToolButton( pix, "One directory up", QString::null,
                                    this, SLOT( cdUp() ), toolbar, "cd up" );

        pix = QPixmap( newfolder_xpm );
        mkdirButton = new QToolButton( pix, "New Folder", QString::null,
                                       this, SLOT( newFolder() ), toolbar, "new folder" );

        connect( dirlist, SIGNAL( folderSelected( const QString & ) ),
                 fileview, SLOT ( setDirectory( const QString & ) ) );
        connect( fileview, SIGNAL( directoryChanged( const QString & ) ),
                 this, SLOT( directoryChanged( const QString & ) ) );
        connect( fileview, SIGNAL( startReadDir( int ) ),
                 this, SLOT( slotStartReadDir( int ) ) );
        connect( fileview, SIGNAL( readNextDir() ),
                 this, SLOT( slotReadNextDir() ) );
        connect( fileview, SIGNAL( readDirDone() ),
                 this, SLOT( slotReadDirDone() ) );

        setDockEnabled( DockLeft, FALSE );
        setDockEnabled( DockRight, FALSE );

        label = new QLabel( statusBar() );
        statusBar()->addWidget( label, 2, TRUE );
        progress = new QProgressBar( statusBar() );
        statusBar()->addWidget( progress, 1, TRUE );

        connect( fileview, SIGNAL( enableUp() ),
                 this, SLOT( enableUp() ) );
        connect( fileview, SIGNAL( disableUp() ),
                 this, SLOT( disableUp() ) );
        connect( fileview, SIGNAL( enableMkdir() ),
                 this, SLOT( enableMkdir() ) );
        connect( fileview, SIGNAL( disableMkdir() ),
                 this, SLOT( disableMkdir() ) );
    }

    void FileMainWindow::setPathCombo()
    {
        QString dir = caption();
        int i = 0;
        bool found = FALSE;
        for ( i = 0; i < pathCombo->count(); ++i ) {
            if ( pathCombo->text( i ) == dir) {
                found = TRUE;
                break;
            }
        }

        if ( found )
            pathCombo->setCurrentItem( i );
        else {
            pathCombo->insertItem( dir );
            pathCombo->setCurrentItem( pathCombo->count() - 1 );
        }

    }

    void FileMainWindow::directoryChanged( const QString &dir )
    {
        setCaption( dir );
        setPathCombo();
    }

    void FileMainWindow::slotStartReadDir( int dirs )
    {
        label->setText( tr( " Reading Directory..." ) );
        progress->reset();
        progress->setTotalSteps( dirs );
    }

    void FileMainWindow::slotReadNextDir()
    {
        int p = progress->progress();
        progress->setProgress( ++p );
    }

    void FileMainWindow::slotReadDirDone()
    {
        label->setText( tr( " Reading Directory Done." ) );
        progress->setProgress( progress->totalSteps() );
    }

    void FileMainWindow::cdUp()
    {
        QDir dir = fileview->currentDir();
        dir.cd( ".." );
        fileview->setDirectory( dir );
    }

    void FileMainWindow::newFolder()
    {
        fileview->newDirectory();
    }

    void FileMainWindow::changePath( const QString &path )
    {
        if ( QFileInfo( path ).exists() )
            fileview->setDirectory( path );
        else
            setPathCombo();
    }

    void FileMainWindow::enableUp()
    {
        upButton->setEnabled( TRUE );
    }

    void FileMainWindow::disableUp()
    {
        upButton->setEnabled( FALSE );
    }

    void FileMainWindow::enableMkdir()
    {
        mkdirButton->setEnabled( TRUE );
    }

    void FileMainWindow::disableMkdir()
    {
        mkdirButton->setEnabled( FALSE );
    }

Main:

    /****************************************************************************
    ** $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 "mainwindow.h"
    #include "qfileiconview.h"

    #include <qapplication.h>

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

        FileMainWindow mw;
        mw.resize( 680, 480 );
        a.setMainWidget( &mw );
        mw.fileView()->setDirectory( "/" );
        mw.show();
        return a.exec();
    }

See also Examples.