亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

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

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

不多說,上源碼:

Dialog.pro 

#-------------------------------------------------
#
# Project created by QtCreator 2015-10-29T23:52:56
#
#-------------------------------------------------
QT += core gui
QT += network #這里要添加這個庫
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;//這個是重點
protected slots:
 //處理按鈕的點擊信號
 void slotPut();
 void slotGet();
 //處理網(wǎng)絡(luò)連接的信號
 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);//固定大小
 //按鈕點擊事件信號槽的連接
 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 ;
 }
 //重點!將之前的槽清空并重新連接至需要的
 manager.disconnect(SIGNAL(finished(QNetworkReply*)));
 //完全清空某對象連接的槽可以用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ò)的連接信號
}
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、運行截圖

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

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

相關(guān)文章

  • C++游戲編程之模擬實現(xiàn)鍵盤打字程序

    C++游戲編程之模擬實現(xiàn)鍵盤打字程序

    這篇文章主要介紹了通過C++模擬實現(xiàn)鍵盤打字的功能,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)C++有一定的幫助,感興趣的小伙伴可以學(xué)習(xí)一下
    2021-12-12
  • OpenCV 顏色追蹤的示例代碼

    OpenCV 顏色追蹤的示例代碼

    這篇文章主要介紹了OpenCV 顏色追蹤的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • C語言進階教程之循環(huán)語句缺陷詳析

    C語言進階教程之循環(huán)語句缺陷詳析

    循環(huán)語句是用于重復(fù)執(zhí)行某條語句(循環(huán)體)的語句,它包含一個控制表達式,每循環(huán)執(zhí)行一次都要對控制表達式進行判斷,如果表達式為真,則繼續(xù)執(zhí)行循環(huán),這篇文章主要給大家介紹了關(guān)于C語言進階教程之循環(huán)語句缺陷的相關(guān)資料,需要的朋友可以參考下
    2021-08-08
  • C語言關(guān)鍵字union的定義和使用詳解

    C語言關(guān)鍵字union的定義和使用詳解

    這篇文章主要介紹了C語言關(guān)鍵字union的定義和使用詳解,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-02-02
  • C++實現(xiàn)查殼程序代碼實例

    C++實現(xiàn)查殼程序代碼實例

    這篇文章主要介紹了C++實現(xiàn)查殼程序代碼實例,有比較詳細(xì)的注釋,包含了對原理的說明,有一定的參考借鑒價值,需要的朋友可以參考下
    2014-10-10
  • OpenCV透視變換應(yīng)用之書本視圖矯正+廣告屏幕切換

    OpenCV透視變換應(yīng)用之書本視圖矯正+廣告屏幕切換

    透視變換是指利用透視中心、像點、目標(biāo)點三點共線的條件,按透視旋轉(zhuǎn)定律使承影面繞跡線旋轉(zhuǎn)某一角度,破壞原有的投影光線束,仍能保持承影面上投影幾何圖形不變的變換。本文將為大家介紹兩個OpenCV透視變換應(yīng)用,需要的可以參考一下
    2022-08-08
  • 鏈接庫動態(tài)鏈接庫詳細(xì)介紹

    鏈接庫動態(tài)鏈接庫詳細(xì)介紹

    靜態(tài)鏈接庫.lib和動態(tài)鏈接庫.dll。其中動態(tài)鏈接庫在被使用的時候,通常還提供一個.lib,稱為引入庫,它主要提供被Dll導(dǎo)出的函數(shù)和符號名稱,使得鏈接的時候能夠找到dll中對應(yīng)的函數(shù)映射
    2012-11-11
  • C語言深入淺出講解直接插入排序算法的實現(xiàn)

    C語言深入淺出講解直接插入排序算法的實現(xiàn)

    插入排序也是最簡單的一類排序方法,我今天介紹的也是插入排序里最直觀且淺顯易懂的直接插入排序。對這個很簡單的排序,記得當(dāng)時也是花了近兩個晚上才搞懂它的原理的,接下來就來介紹一下
    2022-05-05
  • 淺談c++ stl迭代器失效的問題

    淺談c++ stl迭代器失效的問題

    下面小編就為大家?guī)硪黄獪\談c++ stl迭代器失效的問題。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧,祝大家游戲愉快哦
    2016-12-12
  • C語言利用結(jié)構(gòu)體數(shù)組實現(xiàn)學(xué)生成績管理系統(tǒng)

    C語言利用結(jié)構(gòu)體數(shù)組實現(xiàn)學(xué)生成績管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語言利用結(jié)構(gòu)體數(shù)組實現(xiàn)學(xué)生成績管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01

最新評論