ftpwindow.cpp

来自「奇趣公司比较新的qt/emd版本」· C++ 代码 · 共 305 行

CPP
305
字号
/******************************************************************************** Copyright (C) 2004-2007 Trolltech ASA. All rights reserved.**** This file is part of the example classes of the Qt Toolkit.**** This file may be used under the terms of the GNU General Public** License version 2.0 as published by the Free Software Foundation** and appearing in the file LICENSE.GPL included in the packaging of** this file.  Please review the following information to ensure GNU** General Public Licensing requirements will be met:** http://trolltech.com/products/qt/licenses/licensing/opensource/**** If you are unsure which license is appropriate for your use, please** review the following information:** http://trolltech.com/products/qt/licenses/licensing/licensingoverview** or contact the sales department at sales@trolltech.com.**** In addition, as a special exception, Trolltech gives you certain** additional rights. These rights are described in the Trolltech GPL** Exception version 1.0, which can be found at** http://www.trolltech.com/products/qt/gplexception/ and in the file** GPL_EXCEPTION.txt in this package.**** In addition, as a special exception, Trolltech, as the sole copyright** holder for Qt Designer, grants users of the Qt/Eclipse Integration** plug-in the right for the Qt/Eclipse Integration to link to** functionality provided by Qt Designer and its related libraries.**** Trolltech reserves all rights not expressly granted herein.**** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.******************************************************************************/#include <QtGui>#include <QtNetwork>#include "ftpwindow.h"FtpWindow::FtpWindow(QWidget *parent)    : QDialog(parent), ftp(0){    ftpServerLabel = new QLabel(tr("Ftp &server:"));    ftpServerLineEdit = new QLineEdit("ftp.trolltech.com");    ftpServerLabel->setBuddy(ftpServerLineEdit);    statusLabel = new QLabel(tr("Please enter the name of an FTP server."));    fileList = new QTreeWidget;    fileList->setEnabled(false);    fileList->setRootIsDecorated(false);    fileList->setHeaderLabels(QStringList() << tr("Name") << tr("Size") << tr("Owner") << tr("Group") << tr("Time"));    fileList->header()->setStretchLastSection(false);    connectButton = new QPushButton(tr("Connect"));    connectButton->setDefault(true);        cdToParentButton = new QPushButton;    cdToParentButton->setIcon(QPixmap(":/images/cdtoparent.png"));    cdToParentButton->setEnabled(false);    downloadButton = new QPushButton(tr("Download"));    downloadButton->setEnabled(false);    quitButton = new QPushButton(tr("Quit"));    buttonBox = new QDialogButtonBox;    buttonBox->addButton(downloadButton, QDialogButtonBox::ActionRole);    buttonBox->addButton(quitButton, QDialogButtonBox::RejectRole);    progressDialog = new QProgressDialog(this);    connect(fileList, SIGNAL(itemActivated(QTreeWidgetItem *, int)),            this, SLOT(processItem(QTreeWidgetItem *, int)));    connect(fileList, SIGNAL(currentItemChanged(QTreeWidgetItem *, QTreeWidgetItem *)),            this, SLOT(enableDownloadButton()));    connect(progressDialog, SIGNAL(canceled()), this, SLOT(cancelDownload()));    connect(connectButton, SIGNAL(clicked()), this, SLOT(connectOrDisconnect()));    connect(cdToParentButton, SIGNAL(clicked()), this, SLOT(cdToParent()));    connect(downloadButton, SIGNAL(clicked()), this, SLOT(downloadFile()));    connect(quitButton, SIGNAL(clicked()), this, SLOT(close()));    QHBoxLayout *topLayout = new QHBoxLayout;    topLayout->addWidget(ftpServerLabel);    topLayout->addWidget(ftpServerLineEdit);    topLayout->addWidget(cdToParentButton);    topLayout->addWidget(connectButton);        QVBoxLayout *mainLayout = new QVBoxLayout;    mainLayout->addLayout(topLayout);    mainLayout->addWidget(fileList);    mainLayout->addWidget(statusLabel);    mainLayout->addWidget(buttonBox);    setLayout(mainLayout);    setWindowTitle(tr("FTP"));}QSize FtpWindow::sizeHint() const{    return QSize(500, 300);}void FtpWindow::connectOrDisconnect(){    if (ftp) {        ftp->abort();        ftp->deleteLater();        ftp = 0;        fileList->setEnabled(false);        cdToParentButton->setEnabled(false);        downloadButton->setEnabled(false);        connectButton->setEnabled(true);        connectButton->setText(tr("Connect"));        setCursor(Qt::ArrowCursor);        return;    }    setCursor(Qt::WaitCursor);        ftp = new QFtp(this);    connect(ftp, SIGNAL(commandFinished(int, bool)),            this, SLOT(ftpCommandFinished(int, bool)));    connect(ftp, SIGNAL(listInfo(const QUrlInfo &)),            this, SLOT(addToList(const QUrlInfo &)));    connect(ftp, SIGNAL(dataTransferProgress(qint64, qint64)),            this, SLOT(updateDataTransferProgress(qint64, qint64)));    fileList->clear();    currentPath.clear();    isDirectory.clear();    QUrl url(ftpServerLineEdit->text());    if (!url.isValid() || url.scheme().toLower() != QLatin1String("ftp")) {        ftp->connectToHost(ftpServerLineEdit->text(), 21);        ftp->login();    } else {        ftp->connectToHost(url.host(), url.port(21));        if (!url.userName().isEmpty())            ftp->login(QUrl::fromPercentEncoding(url.userName().toLatin1()), url.password());        else            ftp->login();        if (!url.path().isEmpty())            ftp->cd(url.path());    }    fileList->setEnabled(true);    connectButton->setEnabled(false);    connectButton->setText(tr("Disconnect"));    statusLabel->setText(tr("Connecting to FTP server %1...")                         .arg(ftpServerLineEdit->text()));}void FtpWindow::downloadFile(){    QString fileName = fileList->currentItem()->text(0);    if (QFile::exists(fileName)) {        QMessageBox::information(this, tr("FTP"),                                 tr("There already exists a file called %1 in "                                    "the current directory.")                                 .arg(fileName));        return;    }    file = new QFile(fileName);    if (!file->open(QIODevice::WriteOnly)) {        QMessageBox::information(this, tr("FTP"),                                 tr("Unable to save the file %1: %2.")                                 .arg(fileName).arg(file->errorString()));        delete file;        return;    }    ftp->get(fileList->currentItem()->text(0), file);    progressDialog->setLabelText(tr("Downloading %1...").arg(fileName));    downloadButton->setEnabled(false);    progressDialog->exec();}void FtpWindow::cancelDownload(){    ftp->abort();}void FtpWindow::ftpCommandFinished(int, bool error){    setCursor(Qt::ArrowCursor);    if (ftp->currentCommand() == QFtp::ConnectToHost) {        if (error) {            QMessageBox::information(this, tr("FTP"),                                     tr("Unable to connect to the FTP server "                                        "at %1. Please check that the host "                                        "name is correct.")                                     .arg(ftpServerLineEdit->text()));            connectOrDisconnect();            return;        }        statusLabel->setText(tr("Logged onto %1.")                             .arg(ftpServerLineEdit->text()));        fileList->setFocus();        downloadButton->setDefault(true);        connectButton->setEnabled(true);        return;    }    if (ftp->currentCommand() == QFtp::Login)        ftp->list();    if (ftp->currentCommand() == QFtp::Get) {        if (error) {            statusLabel->setText(tr("Canceled download of %1.")                                 .arg(file->fileName()));            file->close();            file->remove();        } else {            statusLabel->setText(tr("Downloaded %1 to current directory.")                                 .arg(file->fileName()));            file->close();        }        delete file;        enableDownloadButton();        progressDialog->hide();    } else if (ftp->currentCommand() == QFtp::List) {        if (isDirectory.isEmpty()) {            fileList->addTopLevelItem(new QTreeWidgetItem(QStringList() << tr("<empty>")));            fileList->setEnabled(false);        }    }}void FtpWindow::addToList(const QUrlInfo &urlInfo){    QTreeWidgetItem *item = new QTreeWidgetItem;    item->setText(0, urlInfo.name());    item->setText(1, QString::number(urlInfo.size()));    item->setText(2, urlInfo.owner());    item->setText(3, urlInfo.group());    item->setText(4, urlInfo.lastModified().toString("MMM dd yyyy"));    QPixmap pixmap(urlInfo.isDir() ? ":/images/dir.png" : ":/images/file.png");    item->setIcon(0, pixmap);    isDirectory[urlInfo.name()] = urlInfo.isDir();    fileList->addTopLevelItem(item);    if (!fileList->currentItem()) {        fileList->setCurrentItem(fileList->topLevelItem(0));        fileList->setEnabled(true);    }}void FtpWindow::processItem(QTreeWidgetItem *item, int /*column*/){    QString name = item->text(0);    if (isDirectory.value(name)) {        fileList->clear();        isDirectory.clear();        currentPath += "/" + name;        ftp->cd(name);        ftp->list();        cdToParentButton->setEnabled(true);        setCursor(Qt::WaitCursor);        return;    }}void FtpWindow::cdToParent(){    setCursor(Qt::WaitCursor);    fileList->clear();    isDirectory.clear();    currentPath = currentPath.left(currentPath.lastIndexOf('/'));    if (currentPath.isEmpty()) {        cdToParentButton->setEnabled(false);        ftp->cd("/");    } else {        ftp->cd(currentPath);    }    ftp->list();}void FtpWindow::updateDataTransferProgress(qint64 readBytes,                                           qint64 totalBytes){    progressDialog->setMaximum(totalBytes);    progressDialog->setValue(readBytes);}void FtpWindow::enableDownloadButton(){    QTreeWidgetItem *current = fileList->currentItem();    if (current) {        QString currentFile = current->text(0);        downloadButton->setEnabled(!isDirectory.value(currentFile));    } else {        downloadButton->setEnabled(false);    }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?