最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Qt實(shí)現(xiàn)FTP的上傳和下載的實(shí)例代碼

 更新時(shí)間:2017年07月19日 16:15:40   作者:Myths  
本篇文章主要介紹了Qt實(shí)現(xiàn)FTP的上傳和下載的實(shí)例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧

為了方便網(wǎng)絡(luò)編程,Qt 提供了 Network 模塊。該模塊包含了許多類,本文介紹了Qt實(shí)現(xiàn)FTP的上傳和下載,分享給大家

本來想簡單抄抄書,隨便手寫個(gè)Ftp客戶端的,結(jié)果發(fā)現(xiàn)教材上的是基于Qt4的QFtp類庫,而在Qt5中取消了這一個(gè)類庫(同時(shí)也取消了QHttp等的類),取而代之的是QNetworkAccessManager 這個(gè)類,把這些雜貨全都攬下來了,據(jù)說是因?yàn)橹暗膬蓚€(gè)類有重復(fù)而且效率有問題balabala。于是就百度了一下,發(fā)現(xiàn)百度上要么講的不全,要么就是要去下一個(gè)由熱心網(wǎng)民重新封裝的QFtp類。顯然我并不喜歡無腦復(fù)制粘貼,想好好看下Qt官方提供的東西的用法,深入的理解下Qt網(wǎng)絡(luò)編程,于是就果斷自行g(shù)oogle(話說google真好用),加上查看幫助文檔,終于把一個(gè)簡版的Ftp客戶端大概框架弄清楚了。

不多說,上源碼:

Dialog.pro 

#-------------------------------------------------
#
# Project created by QtCreator 2015-10-29T23:52:56
#
#-------------------------------------------------
QT += core gui
QT += network #這里要添加這個(gè)庫
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = QFtp
TEMPLATE = app
SOURCES += main.cpp
 dialog.cpp
HEADERS += dialog.h

dialog.h

#ifndef DIALOG_H
#define DIALOG_H
//注意需要添加的頭文件
#include<QDialog>
#include<QPushButton>
#include<QFile>
#include<QNetworkReply>
#include<QLineEdit>
#include<QtNetwork/QNetworkAccessManager>
#include<QtNetwork/QNetworkRequest>
#include<QLabel>
#include<QString>
#include<QGridLayout>
#include<QMessageBox>
class Dialog : public QDialog
{
 Q_OBJECT
public:
 Dialog(QWidget *parent = 0);
 ~Dialog();
public:
 QGridLayout *layout;
 QLabel *LbServer,*LbUser,*LbPasswd;
 QLineEdit *LeServer,*LeUser,*LePasswd;
 QPushButton *PbPut,*PbGet;
 QNetworkAccessManager manager;//這個(gè)是重點(diǎn)
protected slots:
 //處理按鈕的點(diǎn)擊信號(hào)
 void slotPut();
 void slotGet();
 //處理網(wǎng)絡(luò)連接的信號(hào)
 void managePut(QNetworkReply*);
 void manageGet(QNetworkReply*);
};
#endif // DIALOG_H

dialog.cpp

#include "dialog.h"
Dialog::Dialog(QWidget *parent)
 : QDialog(parent)
{
 setWindowTitle("My Ftp");
 layout=new QGridLayout(this);
 LbServer=new QLabel("Server:");
 LbUser=new QLabel("User:");
 LbPasswd=new QLabel("Passwd:");
 LeServer=new QLineEdit("ftp://120.27.41.126/home/myths/1.txt");
 LeUser=new QLineEdit("myths");
 LePasswd=new QLineEdit("123456");
 LePasswd->setEchoMode(QLineEdit::Password);//設(shè)置加密顯示
 PbPut=new QPushButton("Put");
 PbGet=new QPushButton("Get");
 layout->addWidget(LbServer,0,0);
 layout->addWidget(LeServer,0,1);
 layout->addWidget(LbUser,1,0);
 layout->addWidget(LeUser,1,1);
 layout->addWidget(LbPasswd,2,0);
 layout->addWidget(LePasswd,2,1);
 layout->addWidget(PbPut,3,0);
 layout->addWidget(PbGet,3,1);
 setFixedSize(300,200);//固定大小
 //按鈕點(diǎn)擊事件信號(hào)槽的連接
 connect(PbPut,SIGNAL(clicked()),this,SLOT(slotPut()));
 connect(PbGet,SIGNAL(clicked()),this,SLOT(slotGet()));
}
void Dialog::managePut(QNetworkReply * reply){
 qDebug()<<reply->error();//輸出調(diào)試信息
 switch(reply->error()){//判斷連接后的狀態(tài)
 case QNetworkReply::NoError:
 QMessageBox::information(this,"Put information","Upload Success!");
 break;
 case QNetworkReply::HostNotFoundError:
 QMessageBox::information(this,"Put information","Host Not Found!");
 break;
 case QNetworkReply::AuthenticationRequiredError:
 QMessageBox::information(this,"Put information","Login Failure!");
 break;
 default:
 QMessageBox::information(this,"Put information","Unknown Failure");
 break;
 }
}
void Dialog::manageGet(QNetworkReply *reply){
 //基本和managerPut類似 
 qDebug()<<reply->error();
 QByteArray data;
 switch(reply->error()){
 case QNetworkReply::NoError:
 data=reply->readAll();//從url中讀取文件內(nèi)容,輸出到data中(也可以再將數(shù)據(jù)寫入到文件中,為了方便,這里就權(quán)且打印一下吧)
 QMessageBox::information(this,"Put information","Upload Success!nThe file you've got is :n"+data);
 break;
 case QNetworkReply::HostNotFoundError:
 QMessageBox::information(this,"Put information","Host Not Found!");
 break;
 case QNetworkReply::AuthenticationRequiredError:
 QMessageBox::information(this,"Put information","Login Failure!");
 break;
 default:
 QMessageBox::information(this,"Put information","Unknown Failure");
 break;
 }
}
Dialog::~Dialog()
{
}
void Dialog::slotPut(){
 //判斷信息輸入完整
 if(LeUser->text().isEmpty()||LePasswd->text().isEmpty()||LeServer->text().isEmpty()){
 QMessageBox::warning(this,"Error","Please fill in the information");
 return ;
 }
 //重點(diǎn)!將之前的槽清空并重新連接至需要的
 manager.disconnect(SIGNAL(finished(QNetworkReply*)));
 //完全清空某對(duì)象連接的槽可以用manager.disconnect();
 connect(&manager,SIGNAL(finished(QNetworkReply*)),SLOT(managePut(QNetworkReply*)));
 //設(shè)置登錄信息
 QUrl url(LeServer->text());
 url.setPort(21);
 url.setUserName(LeUser->text());
 url.setPassword(LePasswd->text());
 QByteArray data="This is the test data.n";
 /*QNetworkReply *reply=*/
 manager.put(QNetworkRequest(url),data);//將data上傳到url中,返回的reply將觸發(fā)網(wǎng)絡(luò)的連接信號(hào)
}
void Dialog::slotGet(){
 //基本意義與slotPut類似
 if(LeUser->text().isEmpty()||LePasswd->text().isEmpty()||LeServer->text().isEmpty()){
 QMessageBox::warning(this,"Error","Please fill in the information");
 return ;
 }
 manager.disconnect(SIGNAL(finished(QNetworkReply*)));
 connect(&manager,SIGNAL(finished(QNetworkReply*)),SLOT(manageGet(QNetworkReply*)));
 QUrl url(LeServer->text());
 url.setPort(21);
 url.setUserName(LeUser->text());
 url.setPassword(LePasswd->text());
 /*QNetworkReply *reply=*/
 manager.get((QNetworkRequest(url)));
}

main.cpp

#include "dialog.h"
#include <QApplication>
int main(int argc, char *argv[])
{
 QApplication a(argc, argv);
 Dialog w;
 w.show();
 return a.exec();
}

5、運(yùn)行截圖

權(quán)且只顯示主界面:

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • win10環(huán)境下C++ vs2015編譯opencv249的教程

    win10環(huán)境下C++ vs2015編譯opencv249的教程

    這篇文章主要介紹了win10環(huán)境下C++ vs2015編譯opencv249的教程,本文分步驟給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-03-03
  • C++ POSIX API超詳細(xì)分析

    C++ POSIX API超詳細(xì)分析

    這篇文章主要介紹了C++ POSIXAPI的使用方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2022-11-11
  • C經(jīng)典算法之二分查找法

    C經(jīng)典算法之二分查找法

    這篇文章主要介紹了C經(jīng)典算法之二分查找法的相關(guān)資料,這里提供兩種方法幫助大家實(shí)現(xiàn)這樣的功能,需要的朋友可以參考下
    2017-10-10
  • C++ for循環(huán)與nullptr的小知識(shí)點(diǎn)分享

    C++ for循環(huán)與nullptr的小知識(shí)點(diǎn)分享

    這篇文章主要是來和大家介紹一些C++中的小知識(shí)點(diǎn),本文分享的是for循環(huán)與nullptr,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解一下
    2023-05-05
  • Qt6.0+vs2019環(huán)境配置的實(shí)現(xiàn)教程

    Qt6.0+vs2019環(huán)境配置的實(shí)現(xiàn)教程

    這篇文章主要介紹了Qt6.0+vs2019環(huán)境配置的實(shí)現(xiàn)教程,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • C語言中深度優(yōu)先搜索(DFS)算法的示例詳解

    C語言中深度優(yōu)先搜索(DFS)算法的示例詳解

    這篇文章主要通過兩個(gè)簡單的示例為大家詳細(xì)介紹一下C語言中深度優(yōu)先搜索(DFS)算法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2023-02-02
  • 利用C++求解八數(shù)碼問題實(shí)例代碼

    利用C++求解八數(shù)碼問題實(shí)例代碼

    所謂八數(shù)碼問題是指這樣一種游戲,將分別標(biāo)有數(shù)字1,2,3,…,8的八塊正方形數(shù)碼牌任意地放在一塊3×3的數(shù)碼盤上,放牌時(shí)要求不能重疊,下面這篇文章主要給大家介紹了關(guān)于利用C++求解八數(shù)碼問題的相關(guān)資料,需要的朋友可以參考下
    2022-11-11
  • C語言中函數(shù)棧幀的創(chuàng)建和銷毀的深層分析

    C語言中函數(shù)棧幀的創(chuàng)建和銷毀的深層分析

    在C語言中,每一個(gè)正在運(yùn)行的函數(shù)都有一個(gè)棧幀與其對(duì)應(yīng),棧幀中存儲(chǔ)的是該函數(shù)的返回地址和局部變量。從邏輯上講,棧幀就是一個(gè)函數(shù)執(zhí)行的環(huán)境:函數(shù)參數(shù)、函數(shù)的局部變量、函數(shù)執(zhí)行完后返回到哪里等等
    2022-04-04
  • 使用Matlab制作簡易版八分音符醬游戲

    使用Matlab制作簡易版八分音符醬游戲

    八分音符醬作為一款聲音控制類游戲,當(dāng)時(shí)還是很受大家的喜愛的。本文將用Matlab制作一款簡易版的八分音符醬游戲,感興趣的可以學(xué)習(xí)一下
    2022-02-02
  • 淺析c++中new和delete的用法

    淺析c++中new和delete的用法

    以下是對(duì)c++中new和delete的用法進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過來參考下
    2013-09-09

最新評(píng)論

汉寿县| 建平县| 宁津县| 威远县| 凤台县| 宁武县| 赞皇县| 手游| 保康县| 合作市| 德化县| 拜城县| 日喀则市| 祥云县| 靖江市| 砚山县| 马鞍山市| 屏南县| 比如县| 乌苏市| 枞阳县| 清河县| 石棉县| 怀远县| 天气| 无极县| 绥宁县| 安新县| 邢台县| 通化县| 武城县| 乐业县| 西华县| 临澧县| 吉安市| 河池市| 西和县| 福鼎市| 晋州市| 宁津县| 宁国市|