QFtp 协议下载

来源:互联网 发布:mac number 下拉菜单 编辑:程序博客网 时间:2024/05/20 20:58

出自Qt creator 快速入门,

效果如图

 

mainwindow.h

#ifndef MAINWINDOW_H#define MAINWINDOW_H#include <QMainWindow>class QFtp;// 以下代码在例程18-4中添加#include <QHash>class QFile;class QUrlInfo;class QTreeWidgetItem;namespace Ui {class MainWindow;}class MainWindow : public QMainWindow{    Q_OBJECTpublic:    explicit MainWindow(QWidget *parent = 0);    ~MainWindow();private:    Ui::MainWindow *ui;    QFtp *ftp;    // 以下代码在例程18-4中添加    // 用来存储一个路径是否为目录的信息    QHash<QString, bool> isDirectory;    // 用来存储现在的路径    QString currentPath;    // 用来表示下载的文件    QFile *file;private slots:    void ftpCommandStarted(int);    void ftpCommandFinished(int, bool);    // 以下代码在例程18-4中添加    // 更新进度条    void updateDataTransferProgress(qint64, qint64 );    // 将服务器上的文件添加到Tree Widget部件中    void addToList(const QUrlInfo &urlInfo);    // 双击一个目录时显示其内容    void processItem(QTreeWidgetItem*, int);    void on_connectButton_clicked();    void on_cdToParentButton_clicked();    void on_downloadButton_clicked();};#endif // MAINWINDOW_H


mainwindow.cpp

#include "mainwindow.h"#include "ui_mainwindow.h"#include <QFtp>#include <QFile>#include <QTreeWidgetItem>MainWindow::MainWindow(QWidget *parent) :    QMainWindow(parent),    ui(new Ui::MainWindow){    ui->setupUi(this);    ui->progressBar->setValue(0);    connect(ui->fileList, SIGNAL(itemActivated(QTreeWidgetItem*, int)),            this, SLOT(processItem(QTreeWidgetItem*, int)));}MainWindow::~MainWindow(){    delete ui;}void MainWindow::ftpCommandStarted(int){    int id = ftp->currentCommand();    switch (id)    {    case QFtp::ConnectToHost :        ui->label->setText(tr("正在连接到服务器…"));        break;    case QFtp::Login :        ui->label->setText(tr("正在登录…"));        break;    case QFtp::Get :        ui->label->setText(tr("正在下载…"));        break;    case QFtp::Close :        ui->label->setText(tr("正在关闭连接…"));    }}void MainWindow::ftpCommandFinished(int, bool error){    if(ftp->currentCommand() == QFtp::ConnectToHost) {        if (error) ui->label->setText(tr("连接服务器出现错误:%1").arg(ftp->errorString()));        else ui->label->setText(tr("连接到服务器成功"));    } else if (ftp->currentCommand() == QFtp::Login) {        if (error) ui->label->setText(tr("登录出现错误:%1").arg(ftp->errorString()));        else {            ui->label->setText(tr("登录成功"));            ftp->list();        }    } else if (ftp->currentCommand() == QFtp::Get) {        if(error) ui->label->setText(tr("下载出现错误:%1").arg(ftp->errorString()));        else {            ui->label->setText(tr("已经完成下载"));            file->close();        }        ui->downloadButton->setEnabled(true);    } else if (ftp->currentCommand() == QFtp::List) {        if (isDirectory.isEmpty())        {            ui->fileList->addTopLevelItem(                        new QTreeWidgetItem(QStringList()<< tr("<empty>")));            ui->fileList->setEnabled(false);            ui->label->setText(tr("该目录为空"));        }    } else if (ftp->currentCommand() == QFtp::Close) {        ui->label->setText(tr("已经关闭连接"));    }}// 连接按钮void MainWindow::on_connectButton_clicked(){    ui->fileList->clear();    currentPath.clear();    isDirectory.clear();    ftp = new QFtp(this);    connect(ftp, SIGNAL(commandStarted(int)), this, SLOT(ftpCommandStarted(int)));    connect(ftp, SIGNAL(commandFinished(int, bool)),            this, SLOT(ftpCommandFinished(int, bool)));    connect(ftp, SIGNAL(listInfo(QUrlInfo)), this, SLOT(addToList(QUrlInfo)));    connect(ftp, SIGNAL(dataTransferProgress(qint64, qint64)),        //下载进度            this, SLOT(updateDataTransferProgress(qint64, qint64)));    QString ftpServer = ui->ftpServerLineEdit->text();    QString userName = ui->userNameLineEdit->text();    QString passWord = ui->passWordLineEdit->text();    ftp->connectToHost(ftpServer, 21);               //默认端口21    ftp->login(userName, passWord);}void MainWindow::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() ? "../myFTP/dir.png" : "../myFTP/file.png");    item->setIcon(0, pixmap);    isDirectory[urlInfo.name()] = urlInfo.isDir();    ui->fileList->addTopLevelItem(item);    if (!ui->fileList->currentItem()) {        ui->fileList->setCurrentItem(ui->fileList->topLevelItem(0));        ui->fileList->setEnabled(true);    }}void MainWindow::processItem(QTreeWidgetItem *item, int){    QString name = item->text(0);    // 如果这个文件是个目录,则打开    if (isDirectory.value(name)) {        ui->fileList->clear();        isDirectory.clear();        currentPath += "/";        currentPath += name;        ftp->cd(name);        ftp->list();        ui->cdToParentButton->setEnabled(true);    }}// 返回上级目录按钮void MainWindow::on_cdToParentButton_clicked(){    ui->fileList->clear();    isDirectory.clear();    currentPath = currentPath.left(currentPath.lastIndexOf('/'));    if (currentPath.isEmpty()) {        ui->cdToParentButton->setEnabled(false);        ftp->cd("/");    } else {        ftp->cd(currentPath);    }    ftp->list();}// 下载按钮void MainWindow::on_downloadButton_clicked(){    QString fileName = ui->fileList->currentItem()->text(0);    file = new QFile(fileName);    if (!file->open(QIODevice::WriteOnly)) {        delete file;        return;    }    ui->downloadButton->setEnabled(false);    ftp->get(ui->fileList->currentItem()->text(0), file);  //get请求  下载 ,}void MainWindow::updateDataTransferProgress(qint64 readBytes,qint64 totalBytes){    ui->progressBar->setMaximum(totalBytes);    ui->progressBar->setValue(readBytes);}


 

main.cpp

#include <QtGui/QApplication>#include "mainwindow.h"#include <QTextCodec>int main(int argc, char *argv[]){    QApplication a(argc, argv);    QTextCodec::setCodecForTr(QTextCodec::codecForLocale());    MainWindow w;    w.show();    return a.exec();}


 

原创粉丝点击