无法在 Qt 中执行 ftp ConnectToHost

Posted

技术标签:

【中文标题】无法在 Qt 中执行 ftp ConnectToHost【英文标题】:Not being able to execute ftp ConnectToHost in Qt 【发布时间】:2013-12-19 08:00:20 【问题描述】:
#include <qftp.h>
#include <qapplication.h>
#include "test.h"
#include "ui_test.h"
#include <qfile.h>

int main()

    QApplication a(argc, argv);
    Test w;
    ftp.connectToHost("192.168.26.129", 21);
    w.show();
    return a.exec();

我是 Qt 的新手,ftp.connectToHost("192.168.26.129", 21) 在 main 中运行良好,但无论何时从类 Test 调用,它都会失败(包含相同的标头),如下所示。

Test::Test(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::Test)
   
    ui->setupUi(this);
    QFtp ftp;

    int x = ftp.connectToHost("192.168.26.129", 21);
    ftp.login("User1", "passwd");

任何建议都会有所帮助。谢谢!

【问题讨论】:

【参考方案1】:

当您的 Test 类构造函数超出范围时,您的 ftp 对象将被销毁。 QFtp::connectToHost 函数不会阻塞并立即返回。 QFtp::login 也是如此。

要解决这个问题,您可以使用new 分配您的QFtp 对象:

QFtp *ftp = new QFtp(this);

【讨论】:

@user3110438 请注意,如果您想在您的Test 类的其他函数中使用ftp 对象,您应该像Laszlo Papp 所说的那样使其成为您的Test 类的成员变量。 【参考方案2】:

我建议使用类成员,因为它是异步操作。您在堆栈上有一个对象,该对象将在函数结束时展开,并且就此而言,对象的生命周期结束。

您有三种选择来处理这个问题:

班级成员

Test::Test(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::Test)
   
    ui->setupUi(this);

    int x = m_ftp.connectToHost("192.168.26.129", 21);
    m_ftp.login("User1", "passwd");

当您在其他方法中也需要 QFtp 对象时,此版本非常有用。

智能指针

Test::Test(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::Test)
   
    ui->setupUi(this);
    QPointer m_ftp = new QFtp());

    int x = ftp->connectToHost("192.168.26.129", 21);
    ftp->login("User1", "passwd");

当你在这个方法中只需要QFtp对象,并且Test类不是QObject时,这个版本很好。

QObject 父子关系

Test::Test(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::Test)
   
    ui->setupUi(this);
    QFtp ftp = new Ftp(this);    

    int x = ftp->connectToHost("192.168.26.129", 21);
    ftp->login("User1", "passwd");

如果“Test”类成为非QObject,这将不起作用,但是当Test继承它时就足够了,并且您只需要该方法中的QFtp对象。

【讨论】:

@user3110438:乐于提供帮助。 :) @Laslzo 上面的代码工作正常,但存在一个问题,即 ftp 仅在 a.exec(); 之后才连接到主机;在主代码中执行。现在的问题是我首先生成了一个应用程序窗口,该窗口在应用程序执行后显示(a.exec),并且从生成的主窗口中我必须执行 FTP 操作但它在那里失败了,我应用了你的建议但仍然失败我的窗口.......我的问题可能很傻......在 Qt 中天真我很抱歉......任何建议都可能会有所帮助

以上是关于无法在 Qt 中执行 ftp ConnectToHost的主要内容,如果未能解决你的问题,请参考以下文章

Qt 4.7 - 如何遍历 FTP 目录中的文件

应用程序 QT 崩溃(带进度条的 ftp 下载)

QT 防止FTP 上传软件在断连处 Crash

qt udp/tcp 绑定发送源端口(Specify source UDP port when writing datagram)

qt udp/tcp 绑定发送源端口(Specify source UDP port when writing datagram)

带有 Qt 的 SQLite 数据库无法发布可执行文件