Мы создаем объект класса
Всю работу делает подкласс
01 class FtpGet : public QObject
02 {
03 Q_OBJECT
04 public:
05 FtpGet(QObject *parent = 0);
06 bool getFile(const QUrl &url);
07 signals:
08 void done;
09 private slots:
10 void ftpDone(bool error);
11 private:
12 QFtp ftp;
13 QFile file;
14 …
15 };
Класс имеет открытую функцию
Класс
01 FtpGet::FtpGet(QObject *parent)
02 : QObject(parent)
03 {
04 connect(&ftp, SIGNAL(done(bool)), this, SLOT(ftpDone(bool)));
05 }
В конструкторе мы подсоединяем сигнал
01 bool FtpGet::getFile(const QUrl &url)
02 {
03 if (!url.isValid) {
04 cerr << "Error: Invalid URL" << endl;
05 return false;
06 }
07 if (url.scheme != "ftp") {
08 cerr << "Error: URL must start with 'ftp:'" << endl;
09 return false;
10 }
11 if (url.path.isEmpty) {
12 cerr << "Error: URL has no path" << endl;
13 return false;
14 }
15 QString localFileName = QFileInfo(url.path).fileName;
16 if (localFileName.isEmpty)
17 localFileName = "ftpget.out";
18 file.setFileName(localFileName);
19 if (!file.open(QIODevice::WriteOnly)) {
20 cerr << "Error: Cannot open "
21 << qPrintable(file.fileName) << " for writing: "
22 << qPrintable(file.errorString) << endl;
23 return false;
24 }
25 ftp.connectToHost(url.host, url.port(21));
26 ftp.login;
27 ftp.get(url.path, &file);
28 ftp.close;
29 return true;
30 }
Функция
Мы не обязываем пользователя указывать имя локального файла и пытаемся сами создать осмысленное имя на основе URL, а при неудаче используем имя