C++ 如何使用QFtp::put在qtc++;?
我想使用QFtp将文本文件上载到FTP服务器 这是我的代码:C++ 如何使用QFtp::put在qtc++;?,c++,qt,qt4,C++,Qt,Qt4,我想使用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);
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);
}
然而,我没有得到任何迹象表明插槽正在被调用。我没有任何消息框弹出。我做错了什么?QFtp类异步工作以传输数据。因此,按顺序调用connecToHost、put、error、currentCommand和close函数将永远不会实际执行任何命令。您需要做的是编写一个类,以便可以使用信号和插槽。在开始传输后捕捉信号是关键。QFtp详细描述中列出的示例对您的问题进行了一些澄清/QFtp类异步工作以传输数据。因此,按顺序调用connecToHost、put、error、currentCommand和close函数将永远不会实际执行任何命令。您需要做的是编写一个类,以便可以使用信号和插槽。在开始传输后捕捉信号是关键。QFtp详细描述中列出的示例对您的问题进行了一些澄清/您拥有的代码片段看起来是正确的(但尚未尝试编译),因此问题可能出在该片段之外的某个地方 作为对另一个答案的响应,您不需要捕捉信号来执行代码。调用put、close等将对这些命令进行排队,它们将在准备就绪时运行,无论您是否连接到信号。请参阅中的“详细说明”。话虽如此,我强烈建议您连接到信号,因为这是您为用户和调试获取反馈的方式 至于为什么您当前的代码不起作用,我想问的最常见的问题是:
这些是我能想到的基本问题。祝你好运 您拥有的代码段看起来是正确的(但尚未尝试编译),因此问题可能出在该代码段之外的某个地方 作为对另一个答案的响应,您不需要捕捉信号来执行代码。调用put、close等将对这些命令进行排队,它们将在准备就绪时运行,无论您是否连接到信号。请参阅中的“详细说明”。话虽如此,我强烈建议您连接到信号,因为这是您为用户和调试获取反馈的方式 至于为什么您当前的代码不起作用,我想问的最常见的问题是:
这些是我能想到的基本问题。祝你好运 现在好多了,但是代码太多了,我说不出哪里出了问题。你能把它全部上传到Github还是BooBu桶吗?已经有一段时间了,你可以考虑选择一个答案……RikSmith-这些都没有用。我最终放弃了这一点,做了一些其他的事情。现在好多了,但是有太多的代码丢失了,我说不出哪里出了问题。你能把它全部上传到Github还是BooBu桶吗?已经有一段时间了,你可以考虑选择一个答案……RikSmith-这些都没有用。我最终放弃了,做了些别的事情。