<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <!-- /home/espenr/tmp/qt-3.3.8-espenr-2499/qt-x11-free-3.3.8/examples/dirview/dirview.doc:5 --> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>A Directory Browser</title> <style type="text/css"><!-- fn { margin-left: 1cm; text-indent: -1cm; } a:link { color: #004faf; text-decoration: none } a:visited { color: #672967; text-decoration: none } body { background: #ffffff; color: black; } --></style> </head> <body> <table border="0" cellpadding="0" cellspacing="0" width="100%"> <tr bgcolor="#E5E5E5"> <td valign=center> <a href="index.html"> <font color="#004faf">Home</font></a> | <a href="classes.html"> <font color="#004faf">All Classes</font></a> | <a href="mainclasses.html"> <font color="#004faf">Main Classes</font></a> | <a href="annotated.html"> <font color="#004faf">Annotated</font></a> | <a href="groups.html"> <font color="#004faf">Grouped Classes</font></a> | <a href="functions.html"> <font color="#004faf">Functions</font></a> </td> <td align="right" valign="center"><img src="logo32.png" align="right" width="64" height="32" border="0"></td></tr></table><h1 align=center>A Directory Browser</h1> <p> This example program demonstrates how to use a listview and listview items to build a multi-column hierarchical, memory- and CPU-efficient directory browser. It also demonstrates how to use Drag&Drop in a listview. <p> <hr> <p> Header file: <p> <pre>/**************************************************************************** ** $Id: qt/dirview.h 3.3.8 edited Jan 11 14:37 $ ** ** Copyright (C) 1992-2007 Trolltech ASA. 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 DIRVIEW_H #define DIRVIEW_H #include <<a href="qlistview-h.html">qlistview.h</a>> #include <<a href="qstring-h.html">qstring.h</a>> #include <<a href="qfile-h.html">qfile.h</a>> #include <<a href="qfileinfo-h.html">qfileinfo.h</a>> #include <<a href="qtimer-h.html">qtimer.h</a>> class QWidget; class QDragEnterEvent; class QDragMoveEvent; class QDragLeaveEvent; class QDropEvent; class FileItem : public <a href="qlistviewitem.html">QListViewItem</a> { public: FileItem( <a href="qlistviewitem.html">QListViewItem</a> *parent, const <a href="qstring.html">QString</a> &s1, const <a href="qstring.html">QString</a> &s2 ) : <a href="qlistviewitem.html">QListViewItem</a>( parent, s1, s2 ), pix( 0 ) {} const <a href="qpixmap.html">QPixmap</a> *pixmap( int i ) const; #if !defined(Q_NO_USING_KEYWORD) using QListViewItem::setPixmap; #endif void setPixmap( <a href="qpixmap.html">QPixmap</a> *p ); private: <a href="qpixmap.html">QPixmap</a> *pix; }; class Directory : public <a href="qlistviewitem.html">QListViewItem</a> { public: Directory( <a href="qlistview.html">QListView</a> * parent, const <a href="qstring.html">QString</a>& filename ); Directory( Directory * parent, const <a href="qstring.html">QString</a>& filename, const <a href="qstring.html">QString</a> &col2 ) : <a href="qlistviewitem.html">QListViewItem</a>( parent, filename, col2 ), pix( 0 ) {} Directory( Directory * parent, const <a href="qstring.html">QString</a>& filename ); <a href="qstring.html">QString</a> text( int column ) const; <a href="qstring.html">QString</a> fullName(); void setOpen( bool ); void setup(); const <a href="qpixmap.html">QPixmap</a> *pixmap( int i ) const; #if !defined(Q_NO_USING_KEYWORD) using QListViewItem::setPixmap; #endif void setPixmap( <a href="qpixmap.html">QPixmap</a> *p ); private: <a href="qfile.html">QFile</a> f; Directory * p; bool readable; bool showDirsOnly; <a href="qpixmap.html">QPixmap</a> *pix; }; class DirectoryView : public <a href="qlistview.html">QListView</a> { <a href="metaobjects.html#Q_OBJECT">Q_OBJECT</a> public: DirectoryView( <a href="qwidget.html">QWidget</a> *parent = 0, const char *name = 0, bool sdo = FALSE ); bool showDirsOnly() { return dirsOnly; } public slots: void setDir( const <a href="qstring.html">QString</a> & ); signals: void folderSelected( const <a href="qstring.html">QString</a> & ); protected slots: void slotFolderSelected( <a href="qlistviewitem.html">QListViewItem</a> * ); void openFolder(); protected: void contentsDragEnterEvent( <a href="qdragenterevent.html">QDragEnterEvent</a> *e ); void contentsDragMoveEvent( <a href="qdragmoveevent.html">QDragMoveEvent</a> *e ); void contentsDragLeaveEvent( <a href="qdragleaveevent.html">QDragLeaveEvent</a> *e ); void contentsDropEvent( <a href="qdropevent.html">QDropEvent</a> *e ); void contentsMouseMoveEvent( <a href="qmouseevent.html">QMouseEvent</a> *e ); void contentsMousePressEvent( <a href="qmouseevent.html">QMouseEvent</a> *e ); void contentsMouseReleaseEvent( <a href="qmouseevent.html">QMouseEvent</a> *e ); private: <a href="qstring.html">QString</a> fullPath(QListViewItem* item); bool dirsOnly; <a href="qlistviewitem.html">QListViewItem</a> *oldCurrent; <a href="qlistviewitem.html">QListViewItem</a> *dropItem; <a href="qtimer.html">QTimer</a>* autoopen_timer; <a href="qpoint.html">QPoint</a> presspos; bool mousePressed; }; #endif </pre> <p> <hr> <p> And here is the main implementation file. Note the way the program scans subdirectories only when it has to. This allows the program to handle very large file systems efficiently. The same technique can be used in any other trees. <p> <pre>/**************************************************************************** ** $Id: qt/dirview.cpp 3.3.8 edited Jan 11 14:37 $ ** ** Copyright (C) 1992-2007 Trolltech ASA. 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 "dirview.h" #include <<a href="qdir-h.html">qdir.h</a>> #include <<a href="qfile-h.html">qfile.h</a>> #include <<a href="qfileinfo-h.html">qfileinfo.h</a>> #include <<a href="qpixmap-h.html">qpixmap.h</a>> #include <<a href="qevent-h.html">qevent.h</a>> #include <<a href="qpoint-h.html">qpoint.h</a>> #include <<a href="qmessagebox-h.html">qmessagebox.h</a>> #include <<a href="qdragobject-h.html">qdragobject.h</a>> #include <<a href="qmime-h.html">qmime.h</a>> #include <<a href="qstrlist-h.html">qstrlist.h</a>> #include <<a href="qstringlist-h.html">qstringlist.h</a>> #include <<a href="qapplication-h.html">qapplication.h</a>> #include <<a href="qheader-h.html">qheader.h</a>> static const char* folder_closed_xpm[]={ "16 16 9 1", "g c #808080", "b c #c0c000", "e c #c0c0c0", "# c #000000", "c c #ffff00", ". c None", "a c #585858", "f c #a0a0a4", "d c #ffffff", "..###...........", ".#abc##.........", ".#daabc#####....", ".#ddeaabbccc#...", ".#dedeeabbbba...", ".#edeeeeaaaab#..", ".#deeeeeeefe#ba.", ".#eeeeeeefef#ba.", ".#eeeeeefeff#ba.", ".#eeeeefefff#ba.", ".##geefeffff#ba.", "...##gefffff#ba.", ".....##fffff#ba.", ".......##fff#b##", ".........##f#b##", "...........####."}; static const char* folder_open_xpm[]={ "16 16 11 1", "# c #000000", "g c #c0c0c0", "e c #303030", "a c #ffa858", "b c #808080", "d c #a0a0a4", "f c #585858", "c c #ffdca8", "h c #dcdcdc", "i c #ffffff", ". c None", "....###.........", "....#ab##.......", "....#acab####...", "###.#acccccca#..", "#ddefaaaccccca#.", "#bdddbaaaacccab#", ".eddddbbaaaacab#", ".#bddggdbbaaaab#", "..edgdggggbbaab#", "..#bgggghghdaab#", "...ebhggghicfab#", "....#edhhiiidab#", "......#egiiicfb#", "........#egiibb#", "..........#egib#", "............#ee#"}; static const char * folder_locked[]={ "16 16 10 1", "h c #808080", "b c #ffa858", "f c #c0c0c0", "e c #c05800", "# c #000000", "c c #ffdca8", ". c None", "a c #585858", "g c #a0a0a4", "d c #ffffff", "..#a#...........", ".#abc####.......", ".#daa#eee#......", ".#ddf#e##b#.....", ".#dfd#e#bcb##...", ".#fdccc#daaab#..", ".#dfbbbccgfg#ba.", ".#ffb#ebbfgg#ba.", ".#ffbbe#bggg#ba.", ".#fffbbebggg#ba.", ".##hf#ebbggg#ba.", "...###e#gggg#ba.", ".....#e#gggg#ba.", "......###ggg#b##", ".........##g#b##", "...........####."}; static const char * pix_file []={ "16 16 7 1", "# c #000000", "b c #ffffff", "e c #000000", "d c #404000", "c c #c0c000", "a c #ffffc0", ". c None", "................", ".........#......", "......#.#a##....", ".....#b#bbba##..", "....#b#bbbabbb#.", "...#b#bba##bb#..", "..#b#abb#bb##...", ".#a#aab#bbbab##.", "#a#aaa#bcbbbbbb#", "#ccdc#bcbbcbbb#.", ".##c#bcbbcabb#..", "...#acbacbbbe...", "..#aaaacaba#....", "...##aaaaa#.....", ".....##aa#......", ".......##......."}; QPixmap *folderLocked = 0; QPixmap *folderClosed = 0; QPixmap *folderOpen = 0; QPixmap *fileNormal = 0; /***************************************************************************** * * Class Directory * *****************************************************************************/ <a name="f476"></a>Directory::Directory( Directory * parent, const <a href="qstring.html">QString</a>& filename ) : <a href="qlistviewitem.html">QListViewItem</a>( parent ), f(filename), showDirsOnly( parent->showDirsOnly ), pix( 0 ) { p = parent; readable = QDir( fullName() ).isReadable(); if ( !readable ) <a href="qlistviewitem.html#setPixmap">setPixmap</a>( folderLocked ); else <a href="qlistviewitem.html#setPixmap">setPixmap</a>( folderClosed ); } Directory::Directory( <a href="qlistview.html">QListView</a> * parent, const <a href="qstring.html">QString</a>& filename ) : <a href="qlistviewitem.html">QListViewItem</a>( parent ), f(filename), showDirsOnly( ( (DirectoryView*)parent )->showDirsOnly() ), pix( 0 ) { p = 0; readable = QDir( fullName() ).isReadable(); } <a name="x1691"></a>void Directory::<a href="qlistviewitem.html#setPixmap">setPixmap</a>( <a href="qpixmap.html">QPixmap</a> *px ) { pix = px; <a href="qlistviewitem.html#setup">setup</a>(); <a href="qlistviewitem.html#widthChanged">widthChanged</a>( 0 ); <a href="qlistviewitem.html#invalidateHeight">invalidateHeight</a>(); <a href="qlistviewitem.html#repaint">repaint</a>(); } <a name="x1689"></a>const QPixmap *Directory::<a href="qlistviewitem.html#pixmap">pixmap</a>( int i ) const { if ( i ) return 0; return pix; } <a name="x1690"></a>void Directory::<a href="qlistviewitem.html#setOpen">setOpen</a>( bool o ) { if ( o ) <a href="qlistviewitem.html#setPixmap">setPixmap</a>( folderOpen ); else <a href="qlistviewitem.html#setPixmap">setPixmap</a>( folderClosed ); if ( o && !childCount() ) { <a href="qstring.html">QString</a> s( fullName() ); <a href="qdir.html">QDir</a> thisDir( s ); <a name="x1667"></a> if ( !thisDir.<a href="qdir.html#isReadable">isReadable</a>() ) { readable = FALSE; <a href="qlistviewitem.html#setExpandable">setExpandable</a>( FALSE ); return; } <a href="qlistviewitem.html#listView">listView</a>()->setUpdatesEnabled( FALSE ); <a name="x1666"></a> const QFileInfoList * files = thisDir.<a href="qdir.html#entryInfoList">entryInfoList</a>(); if ( files ) { QFileInfoListIterator it( *files ); <a href="qfileinfo.html">QFileInfo</a> * fi; <a name="x1694"></a> while( (fi=it.<a href="qlistviewitemiterator.html#current">current</a>()) != 0 ) { ++it; <a name="x1675"></a> if ( fi-><a href="qfileinfo.html#fileName">fileName</a>() == "." || fi-><a href="qfileinfo.html#fileName">fileName</a>() == ".." ) ; // nothing <a name="x1678"></a> else if ( fi-><a href="qfileinfo.html#isSymLink">isSymLink</a>() && !showDirsOnly ) { FileItem *item = new FileItem( this, fi-><a href="qfileinfo.html#fileName">fileName</a>(), "Symbolic Link" ); item-><a href="qlistviewitem.html#setPixmap">setPixmap</a>( fileNormal ); } <a name="x1676"></a> else if ( fi-><a href="qfileinfo.html#isDir">isDir</a>() ) (void)new Directory( this, fi-><a href="qfileinfo.html#fileName">fileName</a>() ); else if ( !showDirsOnly ) { FileItem *item = new FileItem( this, fi-><a href="qfileinfo.html#fileName">fileName</a>(), <a name="x1677"></a> fi-><a href="qfileinfo.html#isFile">isFile</a>()?"File":"Special" ); item-><a href="qlistviewitem.html#setPixmap">setPixmap</a>( fileNormal ); } } } listView()->setUpdatesEnabled( TRUE ); } QListViewItem::<a href="qlistviewitem.html#setOpen">setOpen</a>( o ); } <a name="x1692"></a>void Directory::<a href="qlistviewitem.html#setup">setup</a>() { setExpandable( TRUE ); QListViewItem::<a href="qlistviewitem.html#setup">setup</a>(); } QString <a name="f477"></a>Directory::fullName() { <a href="qstring.html">QString</a> s; if ( p ) { s = p->fullName(); <a name="x1701"></a> s.<a href="qstring.html#append">append</a>( f.name() ); s.<a href="qstring.html#append">append</a>( "/" ); } else { s = f.name(); } return s; } <a name="x1693"></a>QString Directory::<a href="qlistviewitem.html#text">text</a>( int column ) const { if ( column == 0 ) return f.name(); else if ( readable ) return "Directory"; else return "Unreadable Directory"; } /***************************************************************************** * * Class DirectoryView * *****************************************************************************/ <a name="f478"></a>DirectoryView::DirectoryView( <a href="qwidget.html">QWidget</a> *parent, const char *name, bool sdo ) : <a href="qlistview.html">QListView</a>( parent, name ), dirsOnly( sdo ), oldCurrent( 0 ), dropItem( 0 ), mousePressed( FALSE ) { autoopen_timer = new <a href="qtimer.html">QTimer</a>( this ); if ( !folderLocked ) { folderLocked = new <a href="qpixmap.html">QPixmap</a>( folder_locked ); folderClosed = new <a href="qpixmap.html">QPixmap</a>( folder_closed_xpm ); folderOpen = new <a href="qpixmap.html">QPixmap</a>( folder_open_xpm ); fileNormal = new <a href="qpixmap.html">QPixmap</a>( pix_file ); } <a href="qobject.html#connect">connect</a>( this, SIGNAL( <a href="qlistview.html#doubleClicked">doubleClicked</a>( <a href="qlistviewitem.html">QListViewItem</a> * ) ), this, SLOT( slotFolderSelected( <a href="qlistviewitem.html">QListViewItem</a> * ) ) ); <a href="qobject.html#connect">connect</a>( this, SIGNAL( <a href="qlistview.html#returnPressed">returnPressed</a>( <a href="qlistviewitem.html">QListViewItem</a> * ) ), this, SLOT( slotFolderSelected( <a href="qlistviewitem.html">QListViewItem</a> * ) ) ); <a href="qwidget.html#setAcceptDrops">setAcceptDrops</a>( TRUE ); <a href="qscrollview.html#viewport">viewport</a>()->setAcceptDrops( TRUE ); <a name="x1706"></a> <a href="qobject.html#connect">connect</a>( autoopen_timer, SIGNAL( <a href="qtimer.html#timeout">timeout</a>() ), this, SLOT( openFolder() ) ); } void <a name="f479"></a>DirectoryView::slotFolderSelected( <a href="qlistviewitem.html">QListViewItem</a> *i ) { if ( !i || !showDirsOnly() ) return; Directory *dir = (Directory*)i; emit folderSelected( dir->fullName() ); } void <a name="f480"></a>DirectoryView::openFolder() { <a name="x1705"></a> autoopen_timer-><a href="qtimer.html#stop">stop</a>(); if ( dropItem && !dropItem->isOpen() ) { dropItem->setOpen( TRUE ); dropItem->repaint(); } } static const int autoopenTime = 750; <a name="x1679"></a>void DirectoryView::<a href="qscrollview.html#contentsDragEnterEvent">contentsDragEnterEvent</a>( <a href="qdragenterevent.html">QDragEnterEvent</a> *e ) { if ( !QUriDrag::canDecode(e) ) { <a name="x1669"></a> e-><a href="qdragmoveevent.html#ignore">ignore</a>(); return; } oldCurrent = <a href="qlistview.html#currentItem">currentItem</a>(); <a name="x1673"></a> <a href="qlistviewitem.html">QListViewItem</a> *i = <a href="qlistview.html#itemAt">itemAt</a>( <a href="qscrollview.html#contentsToViewport">contentsToViewport</a>(e-><a href="qdropevent.html#pos">pos</a>()) ); if ( i ) { dropItem = i; <a name="x1704"></a> autoopen_timer-><a href="qtimer.html#start">start</a>( autoopenTime ); } } <a name="x1681"></a>void DirectoryView::<a href="qscrollview.html#contentsDragMoveEvent">contentsDragMoveEvent</a>( <a href="qdragmoveevent.html">QDragMoveEvent</a> *e ) { if ( !QUriDrag::canDecode(e) ) { e-><a href="qdragmoveevent.html#ignore">ignore</a>(); return; } <a href="qpoint.html">QPoint</a> vp = <a href="qscrollview.html#contentsToViewport">contentsToViewport</a>( ( (QDragMoveEvent*)e )->pos() ); <a href="qlistviewitem.html">QListViewItem</a> *i = <a href="qlistview.html#itemAt">itemAt</a>( vp ); if ( i ) { <a href="qlistview.html#setSelected">setSelected</a>( i, TRUE ); <a name="x1668"></a> e-><a href="qdragmoveevent.html#accept">accept</a>(); if ( i != dropItem ) { autoopen_timer-><a href="qtimer.html#stop">stop</a>(); dropItem = i; autoopen_timer-><a href="qtimer.html#start">start</a>( autoopenTime ); } <a name="x1672"></a> switch ( e-><a href="qdropevent.html#action">action</a>() ) { case QDropEvent::Copy: break; case QDropEvent::Move: <a name="x1671"></a> e-><a href="qdropevent.html#acceptAction">acceptAction</a>(); break; case QDropEvent::Link: e-><a href="qdropevent.html#acceptAction">acceptAction</a>(); break; default: ; } } else { e-><a href="qdragmoveevent.html#ignore">ignore</a>(); autoopen_timer-><a href="qtimer.html#stop">stop</a>(); dropItem = 0; } } <a name="x1680"></a>void DirectoryView::<a href="qscrollview.html#contentsDragLeaveEvent">contentsDragLeaveEvent</a>( <a href="qdragleaveevent.html">QDragLeaveEvent</a> * ) { autoopen_timer-><a href="qtimer.html#stop">stop</a>(); dropItem = 0; <a href="qlistview.html#setCurrentItem">setCurrentItem</a>( oldCurrent ); <a href="qlistview.html#setSelected">setSelected</a>( oldCurrent, TRUE ); } <a name="x1682"></a>void DirectoryView::<a href="qscrollview.html#contentsDropEvent">contentsDropEvent</a>( <a href="qdropevent.html">QDropEvent</a> *e ) { autoopen_timer-><a href="qtimer.html#stop">stop</a>(); if ( !QUriDrag::canDecode(e) ) { e-><a href="qdragmoveevent.html#ignore">ignore</a>(); return; } <a href="qlistviewitem.html">QListViewItem</a> *item = <a href="qlistview.html#itemAt">itemAt</a>( <a href="qscrollview.html#contentsToViewport">contentsToViewport</a>(e-><a href="qdropevent.html#pos">pos</a>()) ); if ( item ) { <a href="qstrlist.html">QStrList</a> lst; <a name="x1707"></a> QUriDrag::<a href="quridrag.html#decode">decode</a>( e, lst ); <a href="qstring.html">QString</a> str; switch ( e-><a href="qdropevent.html#action">action</a>() ) { case QDropEvent::Copy: str = "Copy"; break; case QDropEvent::Move: str = "Move"; e-><a href="qdropevent.html#acceptAction">acceptAction</a>(); break; case QDropEvent::Link: str = "Link"; e-><a href="qdropevent.html#acceptAction">acceptAction</a>(); break; default: str = "Unknown"; } str += "\n\n"; e-><a href="qdragmoveevent.html#accept">accept</a>(); <a name="x1699"></a> for ( uint i = 0; i < lst.<a href="qptrlist.html#count">count</a>(); ++i ) { <a name="x1709"></a><a name="x1697"></a><a name="x1664"></a> <a href="qstring.html">QString</a> filename = QDir::<a href="qdir.html#convertSeparators">convertSeparators</a>(QUriDrag::<a href="quridrag.html#uriToLocalFile">uriToLocalFile</a>(lst.<a href="qptrlist.html#at">at</a>(i))); str += filename + "\n"; } str += QString( "\nTo\n\n %1" ) .arg( QDir::<a href="qdir.html#convertSeparators">convertSeparators</a>(fullPath(item)) ); <a name="x1695"></a> QMessageBox::<a href="qmessagebox.html#information">information</a>( this, "Drop target", str, "Not implemented" ); } else e-><a href="qdragmoveevent.html#ignore">ignore</a>(); } QString <a name="f481"></a>DirectoryView::fullPath(QListViewItem* item) { <a href="qstring.html">QString</a> fullpath = item-><a href="qlistviewitem.html#text">text</a>(0); <a name="x1688"></a> while ( (item=item-><a href="qlistviewitem.html#parent">parent</a>()) ) { if ( item-><a href="qlistviewitem.html#parent">parent</a>() ) fullpath = item-><a href="qlistviewitem.html#text">text</a>(0) + "/" + fullpath; else fullpath = item-><a href="qlistviewitem.html#text">text</a>(0) + fullpath; } #ifdef Q_WS_WIN <a name="x1702"></a> if (fullpath.<a href="qstring.html#length">length</a>() > 2 && fullpath[1] != ':') { <a href="qdir.html">QDir</a> dir(fullpath); <a name="x1665"></a> fullpath = dir.<a href="qdir.html#currentDirPath">currentDirPath</a>().left(2) + fullpath; } #endif return fullpath; } <a name="x1684"></a>void DirectoryView::<a href="qlistview.html#contentsMousePressEvent">contentsMousePressEvent</a>( <a href="qmouseevent.html">QMouseEvent</a>* e ) { QListView::<a href="qlistview.html#contentsMousePressEvent">contentsMousePressEvent</a>(e); <a href="qpoint.html">QPoint</a> p( contentsToViewport( e-><a href="qdropevent.html#pos">pos</a>() ) ); <a href="qlistviewitem.html">QListViewItem</a> *i = itemAt( p ); if ( i ) { // if the user clicked into the root decoration of the item, don't try to start a drag! <a name="x1696"></a> if ( p.<a href="qpoint.html#x">x</a>() > header()->cellPos( header()->mapToActual( 0 ) ) + <a name="x1686"></a> treeStepSize() * ( i-><a href="qlistviewitem.html#depth">depth</a>() + ( rootIsDecorated() ? 1 : 0) ) + itemMargin() || p.<a href="qpoint.html#x">x</a>() < header()->cellPos( header()->mapToActual( 0 ) ) ) { presspos = e-><a href="qdropevent.html#pos">pos</a>(); mousePressed = TRUE; } } } <a name="x1683"></a>void DirectoryView::<a href="qlistview.html#contentsMouseMoveEvent">contentsMouseMoveEvent</a>( <a href="qmouseevent.html">QMouseEvent</a>* e ) { if ( mousePressed && ( presspos - e-><a href="qdropevent.html#pos">pos</a>() ).manhattanLength() > QApplication::<a href="qapplication.html#startDragDistance">startDragDistance</a>() ) { mousePressed = FALSE; <a href="qlistviewitem.html">QListViewItem</a> *item = itemAt( contentsToViewport(presspos) ); if ( item ) { <a href="qstring.html">QString</a> source = fullPath(item); <a name="x1674"></a> if ( QFile::<a href="qfile.html#exists">exists</a>(source) ) { <a href="quridrag.html">QUriDrag</a>* ud = new <a href="quridrag.html">QUriDrag</a>(viewport()); <a name="x1708"></a> ud-><a href="quridrag.html#setFileNames">setFileNames</a>( source ); <a name="x1670"></a> if ( ud-><a href="qdragobject.html#drag">drag</a>() ) QMessageBox::<a href="qmessagebox.html#information">information</a>( this, "Drag source", QString("Delete ") + QDir::convertSeparators(source), "Not implemented" ); } } } } <a name="x1685"></a>void DirectoryView::<a href="qlistview.html#contentsMouseReleaseEvent">contentsMouseReleaseEvent</a>( <a href="qmouseevent.html">QMouseEvent</a> * ) { mousePressed = FALSE; } void <a name="f482"></a>DirectoryView::setDir( const <a href="qstring.html">QString</a> &s ) { <a href="qlistviewitemiterator.html">QListViewItemIterator</a> it( this ); ++it; for ( ; it.<a href="qlistviewitemiterator.html#current">current</a>(); ++it ) { it.<a href="qlistviewitemiterator.html#current">current</a>()->setOpen( FALSE ); } <a name="x1703"></a> <a href="qstringlist.html">QStringList</a> lst( QStringList::<a href="qstringlist.html#split">split</a>( "/", s ) ); <a href="qlistviewitem.html">QListViewItem</a> *item = <a href="qlistviewitem.html#firstChild">firstChild</a>(); <a name="x1698"></a> QStringList::Iterator it2 = lst.<a href="qvaluelist.html#begin">begin</a>(); <a name="x1700"></a> for ( ; it2 != lst.<a href="qvaluelist.html#end">end</a>(); ++it2 ) { while ( item ) { if ( item-><a href="qlistviewitem.html#text">text</a>( 0 ) == *it2 ) { item-><a href="qlistviewitem.html#setOpen">setOpen</a>( TRUE ); break; } <a name="x1687"></a> item = item-><a href="qlistviewitem.html#itemBelow">itemBelow</a>(); } } if ( item ) setCurrentItem( item ); } void FileItem::<a href="qlistviewitem.html#setPixmap">setPixmap</a>( <a href="qpixmap.html">QPixmap</a> *p ) { pix = p; <a href="qlistviewitem.html#setup">setup</a>(); <a href="qlistviewitem.html#widthChanged">widthChanged</a>( 0 ); <a href="qlistviewitem.html#invalidateHeight">invalidateHeight</a>(); <a href="qlistviewitem.html#repaint">repaint</a>(); } const QPixmap *FileItem::<a href="qlistviewitem.html#pixmap">pixmap</a>( int i ) const { if ( i ) return 0; return pix; } </pre> <p> <hr> <p> Main: <p> <pre>/**************************************************************************** ** $Id: qt/main.cpp 3.3.8 edited Jan 11 14:37 $ ** ** Copyright (C) 1992-2007 Trolltech ASA. 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 <<a href="qapplication-h.html">qapplication.h</a>> #include <<a href="qfileinfo-h.html">qfileinfo.h</a>> #include <<a href="qdir-h.html">qdir.h</a>> #include "dirview.h" int main( int argc, char ** argv ) { <a href="qapplication.html">QApplication</a> a( argc, argv ); DirectoryView mw; <a name="x1714"></a> mw.<a href="qlistview.html#addColumn">addColumn</a>( "Name" ); mw.<a href="qlistview.html#addColumn">addColumn</a>( "Type" ); <a name="x1716"></a> mw.<a href="qlistview.html#setTreeStepSize">setTreeStepSize</a>( 20 ); <a name="x1712"></a> const QFileInfoList* roots = QDir::<a href="qdir.html#drives">drives</a>(); <a href="qptrlistiterator.html">QPtrListIterator</a><QFileInfo> i(*roots); <a href="qfileinfo.html">QFileInfo</a>* fi; while ( (fi = *i) ) { ++i; <a name="x1713"></a> Directory * root = new Directory( &mw, fi-><a href="qfileinfo.html#filePath">filePath</a>() ); if ( roots->count() <= 1 ) <a name="x1718"></a> root-><a href="qlistviewitem.html#setOpen">setOpen</a>( TRUE ); // be interesting } <a name="x1719"></a> mw.<a href="qwidget.html#resize">resize</a>( 400, 400 ); mw.<a href="qwidget.html#setCaption">setCaption</a>( "Qt Example - Directory Browser" ); <a name="x1715"></a> mw.<a href="qlistview.html#setAllColumnsShowFocus">setAllColumnsShowFocus</a>( TRUE ); a.<a href="qapplication.html#setMainWidget">setMainWidget</a>( &mw ); <a name="x1717"></a> mw.<a href="qwidget.html#show">show</a>(); return a.<a href="qapplication.html#exec">exec</a>(); } </pre> <p>See also <a href="examples.html">Examples</a>. <!-- eof --> <p><address><hr><div align=center> <table width=100% cellspacing=0 border=0><tr> <td>Copyright © 2007 <a href="troll.html">Trolltech</a><td align=center><a href="trademarks.html">Trademarks</a> <td align=right><div align=right>Qt 3.3.8</div> </table></div></address></body> </html>