gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 01:01:16 28 4
gpt4 key购买 nike

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

这是我的代码:

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。我应该怎么做?

编辑:
所以我现在有了这段代码:

//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();
}

具有这些功能:

//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);
}

但是,我没有得到任何槽被调用的迹象。我没有弹出任何消息框。我在这里做错了什么?

最佳答案

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

作为对其他答案的回应,您不需要捕捉信号来执行代码。调用 put、close 等会将这些命令排队,它们将在准备就绪时运行,不管您是否连接到信号。请参阅 docs 中的“详细说明” .话虽如此,我强烈建议连接到信号,因为这是您为用户和调试获取反馈的方式。

至于为什么您当前的代码不起作用,我最常问的问题是:

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

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

关于c++ - 我如何使用 QFtp::put 在 Qt C++ 中上传文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8563928/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com