はい、今回から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をはじめようをやっとかないと厳しいですが...))まだ見ていない方はこちらも参考にしてみてください。)