使用QFTP实现客户端功能(上传,下载,创建文件夹,删除文件等操作)

demo界面演示如下:
在这里插入图片描述
通过customContextMenuRequested(QPoint)信号实现鼠标右键事件,对应的槽函数为:

void QFtpWidget::customContextMenuRequestedSlot(QPoint pos) {
    if (m_infoVec.empty()) {
        return;
    }
    m_menu = new QMenu(ui.tableWidget);
    //m_menu->exec(cursor().pos());
    m_menu->move(cursor().pos());
    m_menu->show();
    int x = pos.x();
    int y = pos.y();
    QModelIndex index = ui.tableWidget->indexAt(QPoint(x,y));
    m_crtRow = index.row();
    m_crtCol = index.column();
    if (m_crtRow < m_infoVec.size()) {
        FileInfo info = m_infoVec[m_crtRow];
        m_renameAct = new QAction("重命名", ui.tableWidget);
        connect(m_renameAct, SIGNAL(triggered()), this, SLOT(renameSlot()));
        m_menu->addAction(m_renameAct);
        if (info.type == FileType::File) {
            m_downloadAct = new QAction("下载", ui.tableWidget);;
            connect(m_downloadAct, SIGNAL(triggered()), this, SLOT(downloadSlot()));
            m_menu->addAction(m_downloadAct);
            m_deleteAct = new QAction("删除", ui.tableWidget);
            connect(m_deleteAct, SIGNAL(triggered()), this, SLOT(deleteSlot()));
            m_menu->addAction(m_deleteAct);
        }
        else {
            m_removeAct = new QAction("移除", ui.tableWidget);
            connect(m_removeAct, SIGNAL(triggered()), this, SLOT(removeSlot()));
            m_menu->addAction(m_removeAct);
       }
    }
}

通过commandFinished()信号实现FTP操作的解析,对应的槽函数实现:

void  QFtpWidget::ftpCommandFinishedSlot(int i, bool error) {
    if (ftp->currentCommand() == QFtp::ConnectToHost)
    {
        if (error) {
            ui.textBrowser->append("FTP连接失败-----");
            return;
        }
        else {
            ui.textBrowser->append("FTP连接成功-----");
            ui.connectBtn->setText("断开连接");
            ui.selecFiletBtn->setEnabled(true);
          //  ui.filepathEt->setEnabled(true);
            ui.preBtn->setEnabled(true);
            ui.createBtn->setEnabled(true);
            ftp->list();
        }
    }
    else if (ftp->currentCommand() == QFtp::Close) {
        if (error) {
            ui.textBrowser->append("FTP断开失败-----");
        }
        else {
            clearTableData();
            m_infoVec.clear();
            ui.textBrowser->append("FTP断开成功-----");
        }
    }
    else if (ftp->currentCommand() == QFtp::List) {
        //qDebug() << "ftp->currentCommand() == QFtp::List----------------";
        updateTableWgtData();
    }
    else if (ftp->currentCommand() == QFtp::Put) {
        if (error) {
            ui.textBrowser->append("文件上传失败--------------------------");
        }
        else {
            ui.textBrowser->append("文件上传成功--------------------------");
            ftp->list();
            m_infoVec.clear();
        }
    }
    else if (ftp->currentCommand() == QFtp::Get) {
        if (error) {
            ui.textBrowser->append("文件下载失败--------------------------");
        }
        else {
            m_file->close();
            ui.textBrowser->append("文件下载成功--------------------------");
        }
    }
    else if (ftp->currentCommand() == QFtp::Rename) {
        if (error) {
            ui.textBrowser->append("重命名失败--------------------------");
        }
        else {
            ui.textBrowser->append("重命名成功--------------------------");
            ftp->list();
            m_infoVec.clear();
        }
    }
    else if (ftp->currentCommand() == QFtp::Mkdir) {
        if (error) {
            ui.textBrowser->append("创建文件夹失败--------------------------");
        }
        else {
            ui.textBrowser->append("创建文件夹成功--------------------------");
                   }
    }
    else if (ftp->currentCommand() == QFtp::Remove) {
        if (error) {
            ui.textBrowser->append("删除文件失败--------------------------");
        }
        else {
            ui.textBrowser->append("删除文件成功--------------------------");
            ftp->list();
            m_infoVec.clear();
        }
    }
    else if (ftp->currentCommand() == QFtp::Rmdir) {
        if (error) {
            ui.textBrowser->append("移除文件夹失败--------------------------");
        }
        else {
            ui.textBrowser->append("移除文件夹成功--------------------------");
            ftp->list();
            m_infoVec.clear();
        }
    }
}

上传功能的函数为:

void QFtpWidget::on_selecFiletBtn_clicked() {
    QString str = "打开文件";
    QString filepath = QFileDialog::getOpenFileName(this, str);
    if (filepath.isEmpty()) {
        return;
    }
    QString filename = filepath.split("/").takeLast();
    QFile* file = new QFile(filepath, this);
    filename = QString::fromLatin1(filename.toLocal8Bit());
    ftp->put(file, filename);
}

下载功能函数为:

void QFtpWidget::downloadSlot() {
    if (m_crtRow < m_infoVec.size()) {
        FileInfo info = m_infoVec[m_crtRow];
        if (info.type == FileType::File) {
            QString path = QFileDialog::getExistingDirectory();
            path.append("/").append(info.filename);
            m_file = new QFile(path);
            if(m_file->open(QIODevice::ReadWrite | QIODevice::Append) ){
                path = info.filename;
                ftp->get(QString::fromLatin1(info.filename.toLocal8Bit()), m_file);
            }
        }
    }
}

重命名功能函数为:通过renameSlot设置可编辑状态,通过itemSelectionChangedSlot实现rename功能,同时关闭编辑状态。

void QFtpWidget::renameSlot() {
    if (m_crtRow < m_infoVec.size()) {
        FileInfo info = m_infoVec[m_crtRow];
        m_oldName = info.filename;
        m_isRenamed = true;
        QTableWidgetItem* item = ui.tableWidget->item(m_crtRow, m_crtCol);
        ui.tableWidget->setCurrentCell(m_crtRow, m_crtCol);
        ui.tableWidget->openPersistentEditor(item);
        ui.tableWidget->editItem(item);
    }
}

void QFtpWidget::itemSelectionChangedSlot() {
    if (m_isRenamed) {
        m_isRenamed = false;
        m_newName =  ui.tableWidget->item(m_crtRow, m_crtCol)->text();
        ui.tableWidget->closePersistentEditor(ui.tableWidget->item(m_crtRow, m_crtCol));
        ftp->rename(QString::fromLatin1(m_oldName.toLocal8Bit()), QString::fromLatin1(m_newName.toLocal8Bit()));
    }
}

删除文件功能函数为:

void QFtpWidget::deleteSlot() {
    if (m_crtRow < m_infoVec.size()) {
        QString name = m_infoVec[m_crtRow].filename;
        ftp->remove(QString::fromLatin1(name.toLocal8Bit()));
    }
}

删除文件夹功能函数为:

void QFtpWidget::removeSlot() {
    if (m_crtRow < m_infoVec.size()) {
        QString name = m_infoVec[m_crtRow].filename;
        ftp->rmdir(QString::fromLatin1(name.toLocal8Bit()));
    }
}

新建文件夹功能函数为:

void QFtpWidget::on_createBtn_clicked() {
    if (ftp->state()!= QFtp::LoggedIn) {
        return;
    }
    FileInfo info;
    int row = ui.tableWidget->rowCount();
    //qDebug() << "row---------------------" << row;
    ui.tableWidget->insertRow(row);
    ui.tableWidget->setRowHeight(row, 30);
    QTableWidgetItem* btItem = new QTableWidgetItem();   //靶体  
    btItem->setTextAlignment(Qt::AlignLeft);    //文字居中
    btItem->setFlags(btItem->flags() & (~Qt::ItemIsEditable));
    btItem->setIcon(QIcon("folder.png"));
    QString datatime = QDateTime::currentDateTime().toString("yyyy_MM_dd_hh_mm");
    info.type = FileType::Folder;
    info.filename = datatime;
    btItem->setText(datatime);
    ui.tableWidget->setItem(row, 0, btItem);
    QTableWidgetItem* btItem1 = new QTableWidgetItem();
    btItem1->setTextAlignment(Qt::AlignHCenter);    //文字居中
    btItem1->setText("");
    info.size = "";
    ui.tableWidget->setItem(row, 1, btItem1);
    btItem1->setFlags(btItem1->flags() & (~Qt::ItemIsEditable));
    QTableWidgetItem* btItem2 = new QTableWidgetItem();
    btItem2->setTextAlignment(Qt::AlignHCenter);    //文字居中
    datatime = QDateTime::currentDateTime().toString("yyyy/MM/dd hh:mm");
    info.time = datatime;
    btItem2->setText(datatime);
    ui.tableWidget->setItem(row, 2, btItem2);
    btItem2->setFlags(btItem2->flags() & (~Qt::ItemIsEditable));
    m_infoVec.push_back(info);
    ftp->mkdir(QString::fromLatin1(info.filename.toLocal8Bit()));
}

动态效果展示为:
在这里插入图片描述

  • 4
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值