2012年2月17日金曜日

( Qt C++ )QFtpクラスを使用する


はい、今回からC++ GUI Programming with Qt4 311ページ 14.Networkingの章をやっていきます。
今回はQFtpクラスを使用していきます。

QFtpクラスはその名のとおりFtp処理ができるクラスです。私自身あまりFtpは使ったことがありませんのであまり詳しい説明はできませんが、とりあえず動くサンプルを書いていこうと思います。

サンプルはC++ GUI Programming with Qt4 311ページからのを参考にして簡略化したものを使用します。

いつものようにQtCreaterの使用を前提とします。(QtCreaterなどの使い方は ”Qtをはじめよう" を見てください。)

また.proファイルに QT += network を必ず追加してください。(でなければ動きません。)


ではコードを


(mainwindow.h)
#include <QMainWindow>
#include <qftp.h>
#include <QFile>
#include <QMessageBox>
#include <QTextCodec>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT
    
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private slots:
    void ftpDone(bool error);

private:
    Ui::MainWindow *ui;//uiにはGUI部品に関する記述
    QFtp ftp;
    QFile file;
};


(mainwindow.cpp)
#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)//uiにはGUI部品に関する記述
{
    ui->setupUi(this);//uiのGUI部品類初期化

    QTextCodec::setCodecForTr(QTextCodec::codecForLocale());

    //シグナル、スロット接続
    connect(&ftp, SIGNAL(done(bool)), this, SLOT(ftpDone(bool)));

    file.setFileName("C:\\Users\\win0002\\Desktop\\ftptest.pdf");
    if (!file.open(QIODevice::WriteOnly))
        return;

    ftp.connectToHost("ftp.qt.nokia.com"); 
    ftp.login();                            
    ftp.cd("pub");//ftp.qt.nokia.com/pubへ移動
    ftp.cd("qt");//ftp.qt.nokia.com/pub/qtへ移動
    ftp.cd("pdf");//ftp.qt.nokia.com/pub/qt/pdfへ移動
    ftp.get("QtEWhitepaper.pdf", &file);                     
    ftp.close();
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::ftpDone(bool error)
{
    QString str;
    if(error)
        str = tr("Ftp異常終了");
    else
        str = tr("Ftp正常終了");

     file.close();

    QMessageBox msgBox(this);
    msgBox.setText(str);
    msgBox.exec();
}

はい、簡単ですね。流れはQtサーバに接続し、pdfファイルをダウンロードするという形です。ヘッダ部は説明を省略します。コメントのとおりです。

.cppは説明します。
まずコンストラクタです。
まずslot signalを接続します。メンバ変数のftpのシグナルdone(bool)とmainwindowの独自関数ftpDone(bool)をスロットとして接続しています。done(bool)はダウンロード終了時に送られてきます。引数にはエラーの有無が格納され、errorならtrueが格納されます。
次に保存先ファイルを指定しています。WriteOnryで開きエラーがないか確認します。
ここからftpでサーバに接続していきます。
まずconnectToHostでftpサーバに接続します。第2引数でポートの指定もできますがここでは指定していません。
次にlogin()関数で匿名ログインを行っています。これも引数を指定してユーザーとしてログインできます。
次にcd()でカレントディレクトリを移動しています。最終的にftp.qt.nokia.com/pub/qt/pdfまで移動しています。
次にgetでカレントディレクトリにある"QtEWhitepaper.pdf"をfileへ取得しています。
最後にftpをCloseします。


デストラクタはそのままですので説明省略します。


次にftpDone(bool)です。
この関数はコンストラクタでcoonectしたとおりftpのダウンロードが終了したときによばれます。doneの引数がftpDoneの引数にそのまま格納されますのでここでエラーの有無が確認できます。サンプルではメッセージボックスを使って正常終了かどうかを表示しています。
また、この関数内でfileをCloseしています。閉じないとアプリケーションが終了するまでロックされてしまいます。



実行すると以下のようになります。


以上です。

※Qftpのサンプルは他にもC++ GUI Programming with Qt4に載っています。そちらも参考にしてみてください。
(ほとんどの方はわかっているとは思いますがNokiaのQtの公式ページよりC++ GUI Programming with Qt4 1st PDF 英語版が無料でダウンロードできます。そんなに英語も難しくなく、サンプルプログラムも豊富で実践的でわかりやすいです。((とはいえ先にQtをはじめようをやっとかないと厳しいですが...))まだ見ていない方はこちらも参考にしてみてください。)