An FTP client
This example implements a FTP client. It uses QUrlOperator (which in
turn uses QFtp) to perform its FTP commands.
The API of the FtpMainWindow class (ftpmainwindow.h):
/****************************************************************************
** $Id: qt/ftpmainwindow.h 3.0.6 edited Oct 12 2001 $
**
** Copyright (C) 1992-2000 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 FTPMAINWINDOW_H
#define FTPMAINWINDOW_H
#include <qmainwindow.h>
#include <qurloperator.h>
class FtpView;
class QSplitter;
class QVBox;
class QSpinBox;
class QComboBox;
class QLineEdit;
class QNetworkOperation;
class QLabel;
class QProgressBar;
class FtpMainWindow : public QMainWindow
{
Q_OBJECT
public:
FtpMainWindow();
QSplitter *mainSplitter() const {
return splitter;
}
private:
void setupLeftSide();
void setupRightSide();
void setupCenterCommandBar();
void setup();
private slots:
void slotLocalDirChanged( const QString &path );
void slotLocalDirChanged( const QUrlInfo &info );
void slotRemoteDirChanged( const QString &path );
void slotRemoteDirChanged( const QUrlInfo &info );
void slotConnect();
void slotUpload();
void slotDownload();
void slotLocalStart( QNetworkOperation * );
void slotLocalFinished( QNetworkOperation * );
void slotRemoteStart( QNetworkOperation * );
void slotRemoteFinished( QNetworkOperation * );
void slotLocalDataTransferProgress( int, int, QNetworkOperation * );
void slotRemoteDataTransferProgress( int, int, QNetworkOperation * );
void slotLocalMkDir();
void slotLocalRemove();
void slotRemoteMkDir();
void slotRemoteRemove();
void slotConnectionStateChanged( int, const QString &msg );
private:
QSplitter *splitter;
QVBox *mainWidget;
FtpView *leftView, *rightView;
QComboBox *localCombo, *remoteHostCombo, *remotePathCombo, *userCombo;
QLineEdit *passLined;
QSpinBox *portSpin;
QUrlOperator localOperator, remoteOperator, oldLocal, oldRemote;
QLabel *progressLabel1, *progressLabel2;
QProgressBar *progressBar1, *progressBar2;
};
#endif
The Implementation of the FtpMainWindow class (ftpmainwindow.cpp):
/****************************************************************************
** $Id: qt/ftpmainwindow.cpp 3.0.6 edited Oct 12 2001 $
**
** Copyright (C) 1992-2000 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 "ftpmainwindow.h"
#include "ftpview.h"
#include <qvbox.h>
#include <qhbox.h>
#include <qsplitter.h>
#include <qcombobox.h>
#include <qlabel.h>
#include <qspinbox.h>
#include <qlineedit.h>
#include <qpushbutton.h>
#include <qmessagebox.h>
#include <qprogressbar.h>
#include <qdir.h>
#include <qinputdialog.h>
#include <qapplication.h>
#include <qstatusbar.h>
FtpMainWindow::FtpMainWindow()
: QMainWindow(),
localOperator( "/" )
{
setup();
// connect to the signals of the local QUrlOperator - this will be used to
// work on the local file system (listing dirs, etc.) and to copy files
// TO the local filesystem (downloading)
connect( &localOperator, SIGNAL( newChildren( const QValueList<QUrlInfo> &, QNetworkOperation * ) ),
leftView, SLOT( slotInsertEntries( const QValueList<QUrlInfo> & ) ) );
connect( &localOperator, SIGNAL( start( QNetworkOperation * ) ),
this, SLOT( slotLocalStart( QNetworkOperation *) ) );
connect( &localOperator, SIGNAL( finished( QNetworkOperation * ) ),
this, SLOT( slotLocalFinished( QNetworkOperation *) ) );
connect( leftView, SIGNAL( itemSelected( const QUrlInfo & ) ),
this, SLOT( slotLocalDirChanged( const QUrlInfo & ) ) );
connect( &localOperator, SIGNAL( dataTransferProgress( int, int, QNetworkOperation * ) ),
this, SLOT( slotLocalDataTransferProgress( int, int, QNetworkOperation * ) ) );
// connect to the signals of the remote QUrlOperator - this will be used to
// work on the remote file system (on the FTP Server) and to copy files
// TO the ftp server (uploading)
connect( &remoteOperator, SIGNAL( newChildren( const QValueList<QUrlInfo> &, QNetworkOperation * ) ),
rightView, SLOT( slotInsertEntries( const QValueList<QUrlInfo> & ) ) );
connect( &remoteOperator, SIGNAL( start( QNetworkOperation * ) ),
this, SLOT( slotRemoteStart( QNetworkOperation *) ) );
connect( &remoteOperator, SIGNAL( finished( QNetworkOperation * ) ),
this, SLOT( slotRemoteFinished( QNetworkOperation *) ) );
connect( rightView, SIGNAL( itemSelected( const QUrlInfo & ) ),
this, SLOT( slotRemoteDirChanged( const QUrlInfo & ) ) );
connect( &remoteOperator, SIGNAL( dataTransferProgress( int, int, QNetworkOperation * ) ),
this, SLOT( slotRemoteDataTransferProgress( int, int, QNetworkOperation * ) ) );
connect( &remoteOperator, SIGNAL( connectionStateChanged( int, const QString & ) ),
this, SLOT( slotConnectionStateChanged( int, const QString & ) ) );
// read the local filesystem at the beginning once
localOperator.listChildren();
// create status bar
(void)statusBar();
}
void FtpMainWindow::setupLeftSide()
{
// Setup the left side of the GUI, this is the listview
// of the local filesystem
QVBox *layout = new QVBox( splitter );
layout->setSpacing( 5 );
layout->setMargin( 5 );
QHBox *h = new QHBox( layout );
h->setSpacing( 5 );
QLabel *l = new QLabel( tr( "Local Path:" ), h );
l->setFixedWidth( l->sizeHint().width() );
localCombo = new QComboBox( TRUE, h );
localCombo->insertItem( "/" );
connect( localCombo, SIGNAL( activated( const QString & ) ),
this, SLOT( slotLocalDirChanged( const QString & ) ) );
leftView = new FtpView( layout );
QHBox *bottom = new QHBox( layout );
bottom->setSpacing( 5 );
QPushButton *bMkDir = new QPushButton( tr( "New Directory" ), bottom );
QPushButton *bRemove = new QPushButton( tr( "Remove" ), bottom );
connect( bMkDir, SIGNAL( clicked() ),
this, SLOT( slotLocalMkDir() ) );
connect( bRemove, SIGNAL( clicked() ),
this, SLOT( slotLocalRemove() ) );
splitter->setResizeMode( layout, QSplitter::Stretch );
}
void FtpMainWindow::setupRightSide()
{
// Setup the right side of the GUI, this is the listview
// of the remote filesystem (FTP), needs also lineedits/combos
// for username, password, etc.
QVBox *layout = new QVBox( splitter );
layout->setSpacing( 5 );
layout->setMargin( 5 );
QHBox *h = new QHBox( layout );
h->setSpacing( 5 );
QLabel *l = new QLabel( tr( "Remote Host:" ), h );
l->setFixedWidth( l->sizeHint().width() );
remoteHostCombo = new QComboBox( TRUE, h );
l = new QLabel( tr( "Port:" ), h );
l->setFixedWidth( l->sizeHint().width() );
portSpin = new QSpinBox( 0, 32767, 1, h );
portSpin->setValue( 21 );
portSpin->setFixedWidth( portSpin->sizeHint().width() );
remoteOperator.setPort( portSpin->value() );
h = new QHBox( layout );
h->setSpacing( 5 );
l = new QLabel( tr( "Remote Path:" ), h );
l->setFixedWidth( l->sizeHint().width() );
remotePathCombo = new QComboBox( TRUE, h );
h = new QHBox( layout );
h->setSpacing( 5 );
l = new QLabel( tr( "Username:" ), h );
l->setFixedWidth( l->sizeHint().width() );
userCombo = new QComboBox( TRUE, h );
l = new QLabel( tr( "Password:" ), h );
l->setFixedWidth( l->sizeHint().width() );
passLined = new QLineEdit( h );
passLined->setEchoMode( QLineEdit::Password );
rightView = new FtpView( layout );
QHBox *bottom = new QHBox( layout );
bottom->setSpacing( 5 );
QPushButton *bMkDir = new QPushButton( tr( "New Directory" ), bottom );
QPushButton *bRemove = new QPushButton( tr( "Remove" ), bottom );
connect( bMkDir, SIGNAL( clicked() ),
this, SLOT( slotRemoteMkDir() ) );
connect( bRemove, SIGNAL( clicked() ),
this, SLOT( slotRemoteRemove() ) );
splitter->setResizeMode( layout, QSplitter::Stretch );
connect( remotePathCombo, SIGNAL( activated( const QString & ) ),
this, SLOT( slotRemoteDirChanged( const QString & ) ) );
}
void FtpMainWindow::setupCenterCommandBar()
{
// Setup the command bar in the middle between the two views
QVBox *w = new QVBox( splitter );
splitter->setResizeMode( w, QSplitter::FollowSizeHint );
w->setSpacing( 5 );
w->setMargin( 5 );
QPushButton *bConnect = new QPushButton( tr( "&Connect" ), w );
(void)new QWidget( w );
QPushButton *bUpload = new QPushButton( tr( "== &Upload ==>" ), w );
QPushButton *bDownload = new QPushButton( tr( "<== &Download ==" ), w );
(void)new QWidget( w );
connect( bConnect, SIGNAL( clicked() ),
this, SLOT( slotConnect() ) );
connect( bUpload, SIGNAL( clicked() ),
this, SLOT( slotUpload() ) );
connect( bDownload, SIGNAL( clicked() ),
this, SLOT( slotDownload() ) );
}
void FtpMainWindow::setup()
{
// Setup the GUI
mainWidget = new QVBox( this );
splitter = new QSplitter( mainWidget );
setupLeftSide();
setupCenterCommandBar();
setupRightSide();
progressLabel1 = new QLabel( tr( "No Operation in Progress" ), mainWidget );
progressBar1 = new QProgressBar( mainWidget );
progressLabel2 = new QLabel( tr( "No Operation in Progress" ), mainWidget );
progressBar2 = new QProgressBar( mainWidget );
progressLabel1->hide();
progressBar1->hide();
progressLabel2->hide();
progressBar2->hide();
setCentralWidget( mainWidget );
}
void FtpMainWindow::slotLocalDirChanged( const QString &path )
{
// The user changed the path on the left side
oldLocal = localOperator;
localOperator.setPath( path );
localOperator.listChildren();
}
void FtpMainWindow::slotLocalDirChanged( const QUrlInfo &info )
{
// The user changed the path on the left side
oldLocal = localOperator;
localOperator.addPath( info.name() );
localOperator.listChildren();
localCombo->insertItem( localOperator.path(), 0 );
localCombo->setCurrentItem( 0 );
}
void FtpMainWindow::slotRemoteDirChanged( const QString &path )
{
// The user changed the path on the right side
if ( !remoteOperator.isValid() )
return;
oldRemote = remoteOperator;
remoteOperator.setPath( path );
remoteOperator.listChildren();
}
void FtpMainWindow::slotRemoteDirChanged( const QUrlInfo &info )
{
// The user changed the path on the right side
oldRemote = remoteOperator;
remoteOperator.addPath( info.name() );
remoteOperator.listChildren();
remotePathCombo->insertItem( remoteOperator.path(), 0 );
remotePathCombo->setCurrentItem( 0 );
}
void FtpMainWindow::slotConnect()
{
// The user pressed the connect button, so let's connect to the
// FTP server
// First we need to set stuff (host, path, etc.) which the user
// entered on the right side to the remote QUrlOperator
// protocol + hostname
QString s = "ftp://" + remoteHostCombo->currentText();
oldRemote = remoteOperator;
remoteOperator = s;
// path on the server
if ( !remotePathCombo->currentText().isEmpty() )
remoteOperator.setPath( remotePathCombo->currentText() );
else
remoteOperator.setPath( "/" );
// if nothing or "ftp" or "anonymous" has been entered into the username combo,
// let's connect anonymous, else private with password
if ( !userCombo->currentText().isEmpty() &&
userCombo->currentText().lower() != "anonymous" &&
userCombo->currentText().lower() != "ftp" ) {
remoteOperator.setUser( userCombo->currentText() );
remoteOperator.setPassword( passLined->text() );
}
// set the port
remoteOperator.setPort( portSpin->value() );
// finally read the directory on the ftp server
remoteOperator.listChildren();
}
void FtpMainWindow::slotUpload()
{
// the user pressed the upload button
// if files have been selected on the left side (local filesystem)
QValueList<QUrlInfo> files = leftView->selectedItems();
if ( files.isEmpty() )
return;
// create a list of the URLs which should be copied
QStringList lst;
QValueList<QUrlInfo>::Iterator it = files.begin();
for ( ; it != files.end(); ++it )
lst << QUrl( localOperator, ( *it ).name() );
// copy the list of selected files to the directory in which the
// remoteOperator currently is (upload)
remoteOperator.copy( lst, remoteOperator, FALSE );
}
void FtpMainWindow::slotDownload()
{
// if the user pressed the download button
// if files have been selected on the right side (remote filesystem)
QValueList<QUrlInfo> files = rightView->selectedItems();
if ( files.isEmpty() )
return;
// create a list of the URLs which should be downloaded
QStringList lst;
QValueList<QUrlInfo>::Iterator it = files.begin();
for ( ; it != files.end(); ++it )
lst << QUrl( remoteOperator, ( *it ).name() );
// copy the list of selected files to the directory in which the
// localOperator currently is (download)
localOperator.copy( lst, localOperator, FALSE );
}
void FtpMainWindow::slotLocalStart( QNetworkOperation *op )
{
// this slot is always called if the local QUrlOperator starts
// listing a directory or dowloading a file
if ( !op )
return;
if ( op->operation() == QNetworkProtocol::OpListChildren ) {
// start listing a dir? clear the left view!
leftView->clear();
} else if ( op->operation() == QNetworkProtocol::OpGet ) {
// start downloading a file? reset the progress bar!
progressBar1->setTotalSteps( 0 );
progressBar1->reset();
}
}
void FtpMainWindow::slotLocalFinished( QNetworkOperation *op )
{
// this slot is always called if the local QUrlOperator finished
// an operation
if ( !op )
return;
if ( op && op->state() == QNetworkProtocol::StFailed ) {
// an error happend, let the user know that
QMessageBox::critical( this, tr( "ERROR" ), op->protocolDetail() );
// do something depending in the error code
int ecode = op->errorCode();
if ( ecode == QNetworkProtocol::ErrListChildren || ecode == QNetworkProtocol::ErrParse ||
ecode == QNetworkProtocol::ErrUnknownProtocol || ecode == QNetworkProtocol::ErrLoginIncorrect ||
ecode == QNetworkProtocol::ErrValid || ecode == QNetworkProtocol::ErrHostNotFound ||
ecode == QNetworkProtocol::ErrFileNotExisting ) {
localOperator = oldLocal;
localCombo->setEditText( localOperator.path() );
localOperator.listChildren();
}
} else if ( op->operation() == QNetworkProtocol::OpPut ) {
// finished saving the downloaded file? reread the dir and hide the progress bar
localOperator.listChildren();
progressLabel1->hide();
progressBar1->hide();
} else if ( op->operation() == QNetworkProtocol::OpGet ) {
// finished reading a file from the ftp server? reset the progress bar
progressBar1->setTotalSteps( 0 );
progressBar1->reset();
}
}
void FtpMainWindow::slotRemoteStart( QNetworkOperation *op )
{
// this slot is always called if the remote QUrlOperator starts
// listing a directory or uploading a file
if ( !op )
return;
if ( op->operation() == QNetworkProtocol::OpListChildren ) {
// start listing a dir? clear the right view!
rightView->clear();
} else if ( op->operation() == QNetworkProtocol::OpGet ) {
// start downloading a file? reset the progress bar!
progressBar2->setTotalSteps( 0 );
progressBar2->reset();
}
}
void FtpMainWindow::slotRemoteFinished( QNetworkOperation *op )
{
// this slot is always called if the remote QUrlOperator finished
// an operation
if ( !op )
return;
if ( op && op->state() == QNetworkProtocol::StFailed ) {
// an error happend, let the user know that
QMessageBox::critical( this, tr( "ERROR" ), op->protocolDetail() );
// do something depending in the error code
int ecode = op->errorCode();
if ( ecode == QNetworkProtocol::ErrListChildren || ecode == QNetworkProtocol::ErrParse ||
ecode == QNetworkProtocol::ErrUnknownProtocol || ecode == QNetworkProtocol::ErrLoginIncorrect ||
ecode == QNetworkProtocol::ErrValid || ecode == QNetworkProtocol::ErrHostNotFound ||
ecode == QNetworkProtocol::ErrFileNotExisting ) {
remoteOperator = oldRemote;
remoteHostCombo->setEditText( remoteOperator.host() );
remotePathCombo->setEditText( remoteOperator.path() );
passLined->setText( remoteOperator.password() );
userCombo->setEditText( remoteOperator.user() );
portSpin->setValue( remoteOperator.port() );
remoteOperator.listChildren();
}
} else if ( op->operation() == QNetworkProtocol::OpListChildren ) {
// finished reading a dir? set the correct path to the pth combo of the right view
remotePathCombo->setEditText( remoteOperator.path() );
} else if ( op->operation() == QNetworkProtocol::OpPut ) {
// finished saving the uploaded file? reread the dir and hide the progress bar
remoteOperator.listChildren();
progressLabel2->hide();
progressBar2->hide();
} else if ( op->operation() == QNetworkProtocol::OpGet ) {
// finished reading a file from the local filesystem? reset the progress bar
progressBar2->setTotalSteps( 0 );
progressBar2->reset();
}
}
void FtpMainWindow::slotLocalDataTransferProgress( int bytesDone, int bytesTotal,
QNetworkOperation *op )
{
// Show the progress here of the local QUrlOperator reads or writes data
if ( !op )
return;
if ( !progressBar1->isVisible() ) {
if ( bytesDone < bytesTotal) {
progressLabel1->show();
progressBar1->show();
progressBar1->setTotalSteps( bytesTotal );
progressBar1->setProgress( 0 );
progressBar1->reset();
} else
return;
}
if ( progressBar1->totalSteps() == bytesTotal )
progressBar1->setTotalSteps( bytesTotal );
if ( op->operation() == QNetworkProtocol::OpGet )
progressLabel1->setText( tr( "Read: %1" ).arg( op->arg( 0 ) ) );
else if ( op->operation() == QNetworkProtocol::OpPut )
progressLabel1->setText( tr( "Write: %1" ).arg( op->arg( 0 ) ) );
else
return;
progressBar1->setProgress( bytesDone );
}
void FtpMainWindow::slotRemoteDataTransferProgress( int bytesDone, int bytesTotal,
QNetworkOperation *op )
{
// Show the progress here of the remote QUrlOperator reads or writes data
if ( !op )
return;
if ( !progressBar2->isVisible() ) {
if ( bytesDone < bytesTotal) {
progressLabel2->show();
progressBar2->show();
progressBar2->setTotalSteps( bytesTotal );
progressBar2->setProgress( 0 );
progressBar2->reset();
} else
return;
}
if ( progressBar2->totalSteps() != bytesTotal )
progressBar2->setTotalSteps( bytesTotal );
if ( op->operation() == QNetworkProtocol::OpGet )
progressLabel2->setText( tr( "Read: %1" ).arg( op->arg( 0 ) ) );
else if ( op->operation() == QNetworkProtocol::OpPut )
progressLabel2->setText( tr( "Write: %1" ).arg( op->arg( 0 ) ) );
else
return;
progressBar2->setProgress( bytesDone );
}
void FtpMainWindow::slotLocalMkDir()
{
// create a dir on the local filesystem
bool ok = FALSE;
QString name = QInputDialog::getText( tr( "Directory Name:" ), QString::null, QLineEdit::Normal, QString::null, &ok, this );
if ( !name.isEmpty() && ok )
localOperator.mkdir( name );
}
void FtpMainWindow::slotLocalRemove()
{
}
void FtpMainWindow::slotRemoteMkDir()
{
// create a dir on the remote filesystem (FTP server)
bool ok = FALSE;
QString name = QInputDialog::getText( tr( "Directory Name:" ), QString::null, QLineEdit::Normal, QString::null, &ok, this );
if ( !name.isEmpty() && ok )
remoteOperator.mkdir( name );
}
void FtpMainWindow::slotRemoteRemove()
{
}
void FtpMainWindow::slotConnectionStateChanged( int, const QString &msg )
{
statusBar()->message( msg );
}
The API of the FtpViewItem and FtpView classes (ftpview.h):
/****************************************************************************
** $Id: qt/ftpview.h 3.0.6 edited Oct 12 2001 $
**
** Copyright (C) 1992-2000 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 FTPVIEW_H
#define FTPVIEW_H
#include <qlistview.h>
#include <qvaluelist.h>
#include <qurlinfo.h>
class FtpViewItem : public QListViewItem
{
public:
FtpViewItem( QListView *parent, const QUrlInfo &i );
int compare( QListViewItem * i, int col, bool ascending ) const;
QString text( int c ) const;
const QPixmap* pixmap( int c ) const;
QUrlInfo entryInfo() {
return info;
}
private:
QUrlInfo info;
};
class FtpView : public QListView
{
Q_OBJECT
public:
FtpView( QWidget *parent );
QValueList<QUrlInfo> selectedItems() const;
public slots:
void slotInsertEntries( const QValueList<QUrlInfo> &info );
signals:
void itemSelected( const QUrlInfo &info );
private slots:
void slotSelected( QListViewItem *item );
};
#endif
Their Implementation (ftpview.cpp):
/****************************************************************************
** $Id: qt/ftpview.cpp 3.0.6 edited Oct 12 2001 $
**
** Copyright (C) 1992-2000 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 "ftpview.h"
#include <qpixmap.h>
#include <qvaluelist.h>
/* XPM */
static const char* closed_xpm[]={
"15 15 6 1",
". c None",
"b c #ffff00",
"d c #000000",
"* c #999999",
"a c #cccccc",
"c c #ffffff",
"...............",
"..*****........",
".*ababa*.......",
"*abababa******.",
"*cccccccccccc*d",
"*cbababababab*d",
"*cabababababa*d",
"*cbababababab*d",
"*cabababababa*d",
"*cbababababab*d",
"*cabababababa*d",
"*cbababababab*d",
"**************d",
".dddddddddddddd",
"..............."};
/* XPM */
static const char* file_xpm[]={
"13 15 5 1",
". c #7f7f7f",
"# c None",
"c c #000000",
"b c #bfbfbf",
"a c #ffffff",
"..........###",
".aaaaaaaab.##",
".aaaaaaaaba.#",
".aaaaaaaacccc",
".aaaaaaaaaabc",
".aaaaaaaaaabc",
".aaaaaaaaaabc",
".aaaaaaaaaabc",
".aaaaaaaaaabc",
".aaaaaaaaaabc",
".aaaaaaaaaabc",
".aaaaaaaaaabc",
".aaaaaaaaaabc",
".bbbbbbbbbbbc",
"ccccccccccccc"};
QPixmap *folderIcon = 0;
QPixmap *fileIcon = 0;
FtpViewItem::FtpViewItem( QListView *parent, const QUrlInfo &i )
: QListViewItem( parent, i.name() ), info( i )
{
}
int FtpViewItem::compare( QListViewItem * i, int col, bool ascending ) const
{
FtpViewItem *other = (FtpViewItem*)i;
switch ( col ) {
case 1:
if ( info.size() == other->info.size() )
return 0;
else
return info.size() < other->info.size() ? -1 : 1;
case 2:
if ( info.lastModified() == other->info.lastModified() )
return 0;
else
return info.lastModified() < other->info.lastModified() ? -1 : 1;
default:
// use default method for colum 0 and others added in the future
return QListViewItem::compare( i, col, ascending );
};
}
QString FtpViewItem::text( int c ) const
{
switch ( c ) {
case 0:
return info.name();
case 1:
return QString::number( info.size() );
case 2:
return info.lastModified().toString();
}
return "????";
}
const QPixmap *FtpViewItem::pixmap( int c ) const
{
if ( !folderIcon )
folderIcon = new QPixmap( closed_xpm );
if ( !fileIcon )
fileIcon = new QPixmap( file_xpm );
if ( info.isDir() && c == 0 )
return folderIcon;
else if ( info.isFile() && c == 0 )
return fileIcon;
return 0;
}
FtpView::FtpView( QWidget *parent )
: QListView( parent )
{
addColumn( tr( "Name" ) );
addColumn( tr( "Size" ) );
addColumn( tr( "Last Modified" ) );
setColumnAlignment( 1, Qt::AlignRight );
setShowSortIndicator( TRUE );
setAllColumnsShowFocus( TRUE );
setSelectionMode( Extended );
connect( this, SIGNAL( doubleClicked( QListViewItem * ) ),
this, SLOT( slotSelected( QListViewItem * ) ) );
connect( this, SIGNAL( returnPressed( QListViewItem * ) ),
this, SLOT( slotSelected( QListViewItem * ) ) );
}
void FtpView::slotInsertEntries( const QValueList<QUrlInfo> &info )
{
QValueList<QUrlInfo>::ConstIterator it;
for( it = info.begin(); it != info.end(); ++it ) {
if ( (*it).name() != ".." && (*it).name() != "." && (*it).name()[ 0 ] == '.' )
continue;
FtpViewItem *item = new FtpViewItem( this, (*it) );
if ( (*it).isDir() )
item->setSelectable( FALSE );
}
}
void FtpView::slotSelected( QListViewItem *item )
{
if ( !item )
return;
FtpViewItem *i = (FtpViewItem*)item;
if ( i->entryInfo().isDir() )
emit itemSelected( i->entryInfo() );
}
QValueList<QUrlInfo> FtpView::selectedItems() const
{
QValueList<QUrlInfo> lst;
QListViewItemIterator it( (QListView*)this );
for ( ; it.current(); ++it ) {
if ( it.current()->isSelected() ) {
lst << ( (FtpViewItem*)it.current() )->entryInfo();
}
}
return lst;
}
Main (main.cpp):
/****************************************************************************
** $Id: qt/main.cpp 3.0.6 edited Nov 6 2001 $
**
** Copyright (C) 1992-2000 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 <qnetwork.h>
#include <qsplitter.h>
#include "ftpmainwindow.h"
int main( int argc, char **argv )
{
QApplication a( argc, argv );
// call this to register the built-in network protocols, e.g. FTP
// and HTTP.
qInitNetworkProtocols();
FtpMainWindow m;
a.setMainWidget( &m );
QValueList<int> sizes;
sizes << 300 << 70 << 300;
m.mainSplitter()->setSizes( sizes );
m.resize( 800, 600 );
m.show();
return a.exec();
}
See also Network Examples.