首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Qt C++中使用QFtp::put上传文件?

如何在Qt C++中使用QFtp::put上传文件?
EN

Stack Overflow用户
提问于 2011-12-19 23:59:12
回答 2查看 7K关注 0票数 0

我想使用QFtp上传一个文本文件到FTP服务器。

这是我的代码:

代码语言:javascript
复制
QFile *file = new QFile("test.txt");
QFtp *ftp = new QFtp();

if(file->open(QIODevice::ReadWrite)) {
    ftp->setTransferMode(QFtp::Active);
    ftp->connectToHost(server);
    ftp->login(name, password);
    ftp->put(file, "test.txt");
    ftp->close();
}

执行此代码后,我在ftp服务器上看不到任何内容。当我查看QFtp::put的文档时,我发现第一个参数应该是QIODevice或QByteArray。我该怎么做呢?

编辑:

所以我现在有了这个代码:

代码语言:javascript
复制
//ftp.cpp
QFile *file = new QFile("test.txt");
QFtp *ftp = new QFtp();

this->connect(ftp, SIGNAL(commandStarted(int)), SLOT(ftpCommandStarted(int)));
this->connect(ftp, SIGNAL(commandFinished(int, bool)), SLOT(ftpCommandFinished(int, bool)));  
this->connect(ftp, SIGNAL(done(bool)), SLOT(ftpDone(bool)));
this->connect(ftp, SIGNAL(dataTransferProgress(qint64, qint64)), SLOT(ftpDataTransferProgress(qint64, qint64)));
this->connect(ftp, SIGNAL(stateChanged(int)), SLOT(ftpStateChanged(int)));

if(file->open(QIODevice::ReadWrite)) {
    ftp->setTransferMode(QFtp::Active);
    ftp->connectToHost(server);
    ftp->login(name, password);
    ftp->put(file, "test.txt");
    ftp->close();
}

使用这些函数:

代码语言:javascript
复制
//ftp.h
void ftpCommandStarted(int id);
void ftpCommandFinished(int id, bool error);
void ftpDone(bool);
void ftpDataTransferProgress(qint64, qint64);
void ftpStateChanged(int);

//ftp.cpp
void EmailDialog::ftpCommandStarted(int id) {
    this->messageBox("Command Started: " + QString::number(id));
}

void EmailDialog::ftpCommandFinished(int id, bool error) {
    this->messageBox("Command Finished: " + QString::number(id) + " Error: " + (error ? "Error" : "No Error"));
}

void EmailDialog::ftpDone(bool error) {
    this->messageBox("Done " + QString(error ? "Error" : "No Error"));
}

void EmailDialog::ftpDataTransferProgress(qint64 done, qint64 total) {
    this->messageBox("Done: " + QString::number(done) + " Total: " + QString::number(total));
}

void EmailDialog::ftpStateChanged(int state) {
    QString text;
    switch (state) {
        case 0:
            text = "QFtp::Unconnected";
            break;
        case 1:
            text = "QFtp::HostLookup";
            break;
        case 2:
            text = "QFtp::Connecting";
            break;
        case 3:
            text = "QFtp::Connected";
            break;
        case 4:
            text = "QFtp::LoggingIn";
            break;
        case 5:
            text = "QFtp::Closing";
            break;
        default:
            text = "";
            break;
    }
    this->messageBox(text);
}

但是,我没有得到任何指示,表明正在调用插槽。我没有弹出任何消息框。我在这里做错了什么?

EN

回答 2

Stack Overflow用户

发布于 2011-12-24 00:49:18

您拥有的代码片段看起来是正确的(尽管还没有尝试编译它),所以问题可能出在该代码片段之外的某个地方。

作为对另一个答案的响应,您不需要捕获信号来执行代码。调用put、close等,将对这些命令进行排队,当它们准备就绪时,无论您是否连接到信号,它们都将运行。请参考docs中的详细说明。话虽如此,我强烈建议连接到信号,因为这是你为你的用户和调试获得反馈的方式。

至于为什么你当前的代码不能工作,我会问的最常见的问题是:

  1. 包含QFtp对象的类是否扩展QObject?
  2. 您的头文件是否包含Q_OBJECT宏?
  3. 自从扩展QObject或添加Q_OBJECT宏后,您是否重新运行qmake?
  4. 您是否在控制台上收到任何“信号/插槽不存在”的错误?这通常意味着您的signal/slot.
  5. Does名称中有一个拼写错误,您的应用程序有一个事件循环?QFtp requires,因为它会将其调用排队为异步发生。此外,所有信号和槽都需要事件循环才能工作。你通过在你的QApplication上调用exec来启动事件循环,这通常在你的main()中。
  6. 你有防火墙规则阻止你的ftp传输吗?您可能需要使用QFtp::Passive.

这些都是我能想到的基本问题。祝好运!

票数 2
EN

Stack Overflow用户

发布于 2011-12-20 00:02:39

QFtp类以异步方式传输数据。因此,顺序调用connecToHost、put、error、currentCommand和close函数将永远不会实际执行任何命令。你需要做的是编写一个类,这样你就可以使用信号和槽了。在你开始传输之后捕捉信号是关键。QFtp详细描述中列出的示例对您的问题进行了一些说明/

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8563928

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档