在好例子网,分享、交流、成长!
您当前所在位置:首页C/C++ 开发实例桌面应用界面/GUI → FTP客户端实例源码(基于QT)

FTP客户端实例源码(基于QT)

桌面应用界面/GUI

下载此实例
  • 开发语言:C/C++
  • 实例大小:15.61M
  • 下载次数:70
  • 浏览次数:613
  • 发布时间:2019-04-21
  • 实例类别:桌面应用界面/GUI
  • 发 布 人:crazycode
  • 文件格式:.rar
  • 所需积分:2
 相关标签: FTP 客户端 Qt 协议

实例介绍

【实例简介】实现的ftp客户端,能列出/更改目录,上下传文件,显示文件列表等选项。 

基于QT的FTP客户端

【实例截图】

from clipboard

【核心代码】

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QTextCodec>
#include <QMouseEvent>
#include <QPoint>
#include <QButtonGroup>
#include <QMenu>
#include <QHeaderView>
#include "qftp.h"
#include <QInputDialog>
#include <QMessageBox>
#include <QDebug>
#include <QFileDialog>
#include <QHeaderView>
#include <QAction>
#include <QPalette>


MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
     initform();
    setContextMenuPolicy(Qt::DefaultContextMenu);//
}

MainWindow::~MainWindow()
{
    delete ui;
}
//初始化窗口
void MainWindow::initform()
{
    ftp  = new QFtp();
    ui->progressBar->setValue(0);
    ui->lineEdit->setText("192.168.0.108");
    ui->lineEdit_2->setText("Angelzhx");
    ui->lineEdit_3->setText("123456");
    ui->lineEdit_4->setText("D:/");
     ftp->setTransferMode(QFtp::Active);
     // ftp->setTransferMode(QFtp::Passive); beidong
   connect(ftp,SIGNAL(commandStarted(int)),this,SLOT(ftpCommandStarted(int)));
   connect(ui->treeWidget,SIGNAL(itemActivated(QTreeWidgetItem*,int)),
           this,SLOT(processItem(QTreeWidgetItem*,int)));
   this->setFixedSize(this->size());
    connect(ftp,SIGNAL(dataTransferProgress(qint64,qint64)),this,SLOT(updateDataTransferProgress(qint64,qint64)));
    connect(ftp,SIGNAL(listInfo(QUrlInfo)),this,SLOT(addToList(QUrlInfo)));

    connect(ftp,SIGNAL(commandFinished(int,bool)),this,SLOT(ftpCommandFinished(int,bool)));
   connect(ftp,SIGNAL(stateChanged(int)),this,SLOT(ftpStateChanged(int)));

}

//登陆服务器
void MainWindow::on_pushButton_clicked()
{

    if(ui->pushButton->text() == "注销")
    {
        ftp->close();
        ui->pushButton->setText(tr("connect"));
        ui->treeWidget->clear();
        currentPath.clear();
        isDirectory.clear();
    }
    else if(ui->pushButton->text() == "connect")
    {
        ui->treeWidget->clear();
        currentPath.clear();
        isDirectory.clear();
        QString ip=ui->lineEdit->text();
        QString username=ui->lineEdit_2->text();
        QString pwd=ui->lineEdit_3->text();
        ftp->connectToHost(ip, 21);
        ftp->login(username, pwd);
    }

}
//解决中文乱码问题
QString MainWindow::toSpecialEncoding(const QString &inputStr)
{
    QTextCodec *codec= QTextCodec::codecForName("gbk");
    if (codec)
    {
        return QString::fromLatin1(codec->fromUnicode(inputStr));
    }
    else
    {
        return QString("");
    }
}
//文件列表信息输入到表格
void MainWindow::addToList(const QUrlInfo &urlInfo)
{
    QString fileSize; //用于存储文件大小,根据文件大小字节,设置文件在树列表的单位
    if(urlInfo.size() >=0 && urlInfo.size() < 1024)
    {
        fileSize = QString::number(urlInfo.size())   "Byte";
    }
    else if(urlInfo.size() >= 1024 && urlInfo.size() < 1024*1024)
    {
        fileSize = QString::number(urlInfo.size()/1024.0,'f',2)   "KB";
    }
    else if(urlInfo.size() >= 1024*1024 && urlInfo.size() < 1024*1024*1024)
    {
        fileSize = QString::number(urlInfo.size()/1024/1024.0,'f',2)   "MB";
    }
    else if(urlInfo.size() >= 1024*1024*1024)
    {
        fileSize = QString::number(urlInfo.size()/1024/1024/1024.0,'f',2)   "GB";
    }
    //添加文件各信息到树列表
    QTreeWidgetItem *item = new QTreeWidgetItem;
    //转换UrlInfo中的文件名编码,解决乱码
    item->setText(0, urlInfo.name());
    item->setText(1, fileSize);
    item->setText(2, urlInfo.lastModified().toString("yyyy/MM/dd hh:mm"));
  //  item->setText(3, urlInfo.owner());
   // item->setText(4, urlInfo.group());
    //显示文件和文件夹图标
    QPixmap pixmap(urlInfo.isDir() ? ":/1111/dir.png" : ":/1111/file.png");
    item->setIcon(0, pixmap);
    //存储该路径是否为目录的信息
    isDirectory[urlInfo.name()] = urlInfo.isDir();
    ui->treeWidget->addTopLevelItem(item);
    if (!ui->treeWidget->currentItem())
    {
        ui->treeWidget->setCurrentItem(ui->treeWidget->topLevelItem(0));
        ui->treeWidget->setEnabled(true);
    }
}
//上传文件
void MainWindow::on_pushButton_2_clicked()
{
    QString filePath = QFileDialog::getOpenFileName(this,
                                                    tr("打开文件"),
                                                    "./",
                                                    tr("All Files (*);"));
    if(filePath.isEmpty())
        return;
    //打开文件
  QFile   *file = new QFile(filePath);//
    if(!file->open(QIODevice::ReadWrite))
    {
        delete file;
        file = NULL;
        ui->textEdit->append(tr("本地文件:%1打开失败!").arg(file->fileName()));
        return;
    }

    QFileInfo fileinfo(filePath);
    fileName = fileinfo.fileName();
    QMessageBox::information(this,"information","Are you sure download :" fileName);
    //转换上传的文件名编码,解决上传带有中文文件名的文件出错的问题,开始上传
    ftp->put(file,toSpecialEncoding( fileName));
      ui->textEdit->append(tr("正在上传:%1......").arg(fileName));

}
/***************下载文件*****************/
void MainWindow::on_pushButton_3_clicked()
{

        //判断当前储存路径是否为空
        if(ui->lineEdit_4->text().isEmpty())
      {
           openSaveFilePath();
           return;
        }
        QString name = ui->treeWidget->currentItem()->text(0);
        QString str = toSpecialEncoding(name);
        if (isDirectory.value(str)) //如果选中的是目录,则返回
        {
            return;
        }
        else
        {

            downloadFile(name);

        }


}
void MainWindow::downloadFile(const QString &fileName)
{
    //获取当前树列表中选中的文件名,并加上保存路径
    serverFileName = fileName;
    savePath=ui->lineEdit_4->text();
     QString filepath;
    if(serverFileName==NULL)
    filepath = savePath;
    else
         filepath = savePath   "/"   serverFileName;
    file = new QFile(filepath);
     QMessageBox::information(this,"information","Are you sure download :" fileName);
    if (!file->open(QIODevice::WriteOnly))
    {
        delete file;
        ui->textEdit->append(tr("本地文件:%1创建失败!").arg(serverFileName));
        return;
    }

          ftp->get(fileName, file);


 ui->textEdit->append(tr("正在下载:%1......").arg(file->fileName()));
}

//打开文件
void MainWindow::on_pushButton_5_clicked()
{
    openSaveFilePath();
}
//选择文件存储路径
bool MainWindow::openSaveFilePath()
{
    savePath = QFileDialog::getExistingDirectory(this,tr("选择文件保存路径"),"./");
    if(savePath.isEmpty())
    {
        return false;
    }
    else
    {
       ui->lineEdit_4->setText(savePath);
       return true;
    }
}
void MainWindow::ftpCommandStarted(int)
{
    if(ftp->currentCommand() == QFtp::ConnectToHost){
        ui->label_6->setText(tr("正在连接到服务器…"));
    }
    if (ftp->currentCommand() == QFtp::Login){
        ui->label_6->setText(tr("正在登录…"));
    }
    if (ftp->currentCommand() == QFtp::Get){
       ui->label_6->setText(tr("正在下载…"));
    }
    if (ftp->currentCommand() == QFtp::Put){
        ui->label_6->setText(tr("正在上传…"));
    }
    else if (ftp->currentCommand() == QFtp::Close){
        ui->label->setText(tr("正在关闭连接…"));
    }
}
void MainWindow::ftpStateChanged(int state)
{
    if(state == QFtp::Unconnected)
    {
        ui->textEdit->append(tr("未连接到主机"));
    }
    if(state == QFtp::Connected)
    {
        ui->textEdit->append(tr("已经连接到主机"));
    }
    if(state == QFtp::HostLookup)
    {
        ui->textEdit->append(tr("正在查找主机"));
    }
    if(state == QFtp::LoggedIn)
    {
        ui->textEdit->append(tr("已经登录"));
    }
    if(state == QFtp::Closing)
    {
        ui->textEdit->append("连接正在关闭");
    }
}


void MainWindow::contextMenuEvent(QContextMenuEvent *event )
{

    popMenu = new QMenu(this);           //定义一个右键弹出菜单

    QAction *refresh=new QAction("刷新",this);
    popMenu->addAction(refresh);
    connect(refresh,SIGNAL(triggered(bool)),this,SLOT(refreshed()));
    QAction *reName=new QAction("重命名",this);
    popMenu->addAction(reName);
    connect(reName,SIGNAL(triggered(bool)),this,SLOT(fileRename()));
    QAction *removeFile=new QAction("删除",this);
    popMenu->addAction(removeFile);
    connect(removeFile,SIGNAL(triggered(bool)),this,SLOT(deleteFile()));
    QAction *createFolder=new QAction("新建文件夹",this);
    popMenu->addAction(createFolder);
    connect(createFolder,SIGNAL(triggered(bool)),this,SLOT(createNewFolder()));
    QAction *cancel=new QAction("concel",this);
    popMenu->addAction(cancel);
    connect(cancel,SIGNAL(triggered(bool)),this,SLOT(on_cancelBtn_clicked()));

   popMenu->move(cursor().pos());
   popMenu->show();

    //设置菜单风格

  popMenu->setStyleSheet("QMenu{background-color: white;}"
                           "QMenu::item {background-color: transparent;"
                           "padding:6px 30px;}"
                           "QMenu::item:selected {background-color: #2dabf9;}");


}
//刷新列表
void MainWindow::refreshed()
{
    ui->treeWidget->clear();
    ftp->list();
}
//重命名
void MainWindow::fileRename()
{
    QString oldName = ui->treeWidget->currentItem()->text(0);
    QString str = toSpecialEncoding(oldName);
    if(isDirectory.value(str))//选中的是文件夹,则返回
    {
        QMessageBox::information(this,tr("保存"),tr("<font size='6' color='#008ed5'>文件夹不能重命名!</font>"),QMessageBox::Ok);
        return;
    }
    bool ok;
    QString newName  = QInputDialog::getText(this, tr("重命名"),
                                         tr("新文件名:"),
                                         QLineEdit::Normal,tr(""),
                                         &ok,Qt::WindowCloseButtonHint);
    if(newName.isEmpty())
        return;
    ftp->rename(toSpecialEncoding(oldName),toSpecialEncoding(newName));
    refreshed();
}
//删除文件
void MainWindow::deleteFile()
{
    QString deleteFile = ui->treeWidget->currentItem()->text(0);
    QString str = toSpecialEncoding(deleteFile);
    if(isDirectory.value(str))
    {
        deleteFolder();
    }
    QTreeWidgetItem* item = ui->treeWidget->currentItem();
  /*  if(item->childCount() > 0)//如果有子节点,则删除
    {
        for(int i = 0; i < item->childCount(); i   )
        {
            deleleNode(item->child(i));
        }
    }*/
    delete item;
  /*  if(ui->treeWidget->topLevelItemCount()<= 0)
    {
        ui->cdToParentButton->setEnabled(true);
    }*/
    ftp->remove(toSpecialEncoding(deleteFile));

}
//进入目录
void MainWindow::processItem(QTreeWidgetItem *item, int column)
{
    Q_UNUSED(column)//解决未使用的变量出现警告的问题
    QString name = item->text(0);
    //转换树列表中的文件名编码,解决点击项目文件夹无反应的问题
    QString str  = toSpecialEncoding(name);
    if (isDirectory.value(str))
    {
        //如果这个文件是个目录,则打开
        ui->treeWidget->clear();
        isDirectory.clear();
        currentPath  = '/';
        currentPath  = str;
        ftp->cd(str);
        ftp->list();
      //  ui->cdToParentButton->setEnabled(true);
    }
}
//返回上一级菜单
void MainWindow::on_cdToParentButton_clicked()
{
    ui->treeWidget->clear();
    isDirectory.clear();
    currentPath = currentPath.left(currentPath.lastIndexOf('/'));
    if (currentPath.isEmpty())
    {
        ftp->cd("/");
    }
    else
    {
        ftp->cd(currentPath);
    }
    ftp->list();
}
void MainWindow::on_pushButton_4_clicked()
{
    on_cdToParentButton_clicked();

}
//创建文件夹
void MainWindow::createNewFolder()
{
    bool ok;
    QString folderName  = QInputDialog::getText(this, tr("新建文件夹"),
                                         tr("新文件夹名:"),
                                         QLineEdit::Normal,tr(""),
                                         &ok,Qt::WindowCloseButtonHint);
    if(folderName.isEmpty())
        return;
    ftp->mkdir(toSpecialEncoding(folderName));
    ui->treeWidget->clear();
    ftp->list();
}
void MainWindow::on_setButton_clicked()
{
    QMessageBox::about(this,tr("关于"),tr("FTP客户端\n\n"
                                 "--------------声明-----------------\n\n"
                                 "1.本软件仅供学习交流使用\n"
                                 "2.软件名称:FTP客户端\n"
                                 "3.软件版本:1.0\n"
                                 "4.软件作者:OnlyU\n"
                                 "5.邮箱:731482764@qq.com\n\n"

                                 "-------------软件优点--------------\n\n"
                                 "1.实现上传、下载、删除、新建文件夹、重命名、刷新\n"
                                 "2.实现访问服务器的可视化\n"
                                 "3.界面简洁(所有图片资源均为本人用PS软件制作)\n"
                                 "4.实现解决中文乱码问题\n"
                                 "5.实现右键菜单功能\n"

                                 "-------------软件不足--------------\n\n"
                                 "1.由于未经多次测试,可能存在BUG,望使用者与我联系\n"
                                 "2.批量上传下载暂未实现,断点续传也未实现\n"
                                 "3.上传特大会出现卡顿,原因未知\n"
                                 "4.由于时间精力有限,上述不足之处望谅解,待日后有时间予以解决\n\n"));
}
void MainWindow::updateDataTransferProgress(qint64 readBytes, qint64 totalBytes)
{
    ui->progressBar->setMaximum(totalBytes/1024);     //设置进度条的最大值 除1024目的是防止上传下载大文件时进度条卡顿
    ui->progressBar->setValue(readBytes/1024);         //设置进度条的当前值
}
//根据相应命令的完成,进行相应操作
void MainWindow::ftpCommandFinished(int, bool error)
{
    if(ftp->currentCommand() == QFtp::ConnectToHost)
    {
        if(error)
        {
            ui->textEdit->append(tr("连接服务器出现错误:%1").arg(ftp->errorString()));
        }
        else
           ui->label_6->setText(tr("连接到服务器成功"));
    }
    else if(ftp->currentCommand() == QFtp::Login)
    {
        if(error)
        {
            ui->textEdit->append(tr("登录出现错误:%1").arg(ftp->errorString()));
        }
        else
        {
            ui->pushButton->setText(tr("注销"));
            ui->label_6->setText("connect successful");
            ftp->list(); //发射listInfo()信号,显示文件列表
        }
    }
    else if(ftp->currentCommand() == QFtp::Get)
    {
        if(error)
        {
          ui->textEdit->append(tr("下载:%1被取消").arg(serverFileName));
            file->close();
            file->remove();
        }
        else
        {
            //在下载命令完成时,使下载按钮为可用,并关闭打开的文件。
       ui->label_6->setText(tr("已经完成下载"));
        ui->textEdit->append(tr("文件:%1下载完成").arg(serverFileName));
            file->close();
        }
        delete file;
    }
    else if(ftp->currentCommand() == QFtp::Put)
    {
        if(error)
        {
        // ui->textEdit->append(tr("上传:%1被取消").arg(fileName));
            file->close();
        }
        else
        {
            //然后,在上传命令完成时,使上传按钮可用,并关闭打开的文件。
         ui->label_6->setText(tr("已经完成上传"));
       ui->textEdit->append(tr("文件:%1上传完成").arg(fileName));
            refreshed();
          //  file->close();
        }
       // delete file;
    }
    //处理list命令完成时的情况:
    else if(ftp->currentCommand() == QFtp::List)
    {
        if(isDirectory.isEmpty())
        {
            //如果目录为空,显示“empty”
            ui->treeWidget->addTopLevelItem(new QTreeWidgetItem(QStringList()<< tr("<empty>")));
            ui->treeWidget->setEnabled(false);
            ui->label_6->setText(tr("该目录为空"));
          //  ui->cdToParentButton->setEnabled(true);
        }
    }
    else if(ftp->currentCommand() == QFtp::Close)
    {
        ui->textEdit->append(tr("已经关闭连接"));
        ui->label_6->setText(tr("已经关闭连接"));
    }
    else if(ftp->currentCommand() == QFtp::Rename)
    {
        ui->textEdit->append(tr("文件重命名成功"));
        refreshed();
    }
    else if(ftp->currentCommand() == QFtp::Mkdir)
    {
        ui->textEdit->append(tr("新建文件夹成功"));
        refreshed();
    }
    else if(ftp->currentCommand() == QFtp::Remove)
    {
       ui->textEdit->append(tr("文件删除成功"));
        refreshed();
    }
    else if(ftp->currentCommand() == QFtp::Rmdir)
    {
        ui->textEdit->append(tr("文件夹删除成功"));
        refreshed();
    }
}


//删除文件夹
void MainWindow::deleteFolder()
{
    QString folder = ui->treeWidget->currentItem()->text(0);
    QString str = toSpecialEncoding(folder);
    if(isDirectory.value(str))
    {
        ftp->rmdir(toSpecialEncoding(folder));
    }
}
//取消上传和下载
void MainWindow::on_cancelBtn_clicked()
{
    ftp->abort();
    if(file->exists())
    {
        file->close();
    }
    ui->progressBar->setValue(0);

}

标签: FTP 客户端 Qt 协议

实例下载地址

FTP客户端实例源码(基于QT)

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

发表评论

(您的评论需要经过审核才能显示)

查看所有0条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警