Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何使用QFtp::put在qtc++;?_C++_Qt_Qt4 - Fatal编程技术网

C++ 如何使用QFtp::put在qtc++;?

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

我想使用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);
}

然而,我没有得到任何迹象表明插槽正在被调用。我没有任何消息框弹出。我做错了什么?

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

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

您拥有的代码片段看起来是正确的(但尚未尝试编译),因此问题可能出在该片段之外的某个地方

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

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

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

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

    您拥有的代码段看起来是正确的(但尚未尝试编译),因此问题可能出在该代码段之外的某个地方

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

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

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

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

    现在好多了,但是代码太多了,我说不出哪里出了问题。你能把它全部上传到Github还是BooBu桶吗?已经有一段时间了,你可以考虑选择一个答案……RikSmith-这些都没有用。我最终放弃了这一点,做了一些其他的事情。现在好多了,但是有太多的代码丢失了,我说不出哪里出了问题。你能把它全部上传到Github还是BooBu桶吗?已经有一段时间了,你可以考虑选择一个答案……RikSmith-这些都没有用。我最终放弃了,做了些别的事情。